React的开发基础入门

什么是React

React是一个JavaScript库,是由FaceBook和Instagram开发的,主要用于用户创建图形化界面。

开发环境的搭建

做任何开发环境,我都会想着首先需要搭建一个环境来开发。就像如果开发iOS,你需要有苹果电脑,然后从AppStore下载Xcode,然后就可以熟悉一个Xcode,看看文档,就可以开始开发了;就像如果开发Android,你需要安装Android Studio,然后需要安装Java环境,然后就可以进行开发了。对于React,经过了解,我发现任何一个工具,比如Sublime Text,IntelliJ IDEA等等都可以,你甚至直接可以使用文本编辑器等等。这里面我使用的是IntelliJ IDEA。

1、安装一个IntellJ IDEA就可以进行开发了。

2、一个浏览器(这里面我使用的是Chrome)

3、下载相关库(下载链接

预备知识

这个博客主要是介绍的React,我也假设一下:你需要对HTML,CSS,JavaScript有一定的了解,因为代码大部分都是用这些来进行开发的。

最简单的React小程序

我学任何语言的时候第一个程序都是一个Hello,World!。现在就让我们来利用React来写一个最简单的Hello,World!

直接上代码:

<!DOCTYPE html>
<html>
<head>
   <meta charset="utf-8">
   <title>Hello world!</title>
   <script src = "../../build/react.js"></script>
   <script src = "../../build/react-dom.js"></script>
   <script src = "../../build/browser.min.js"></script>
</head>
<body>
   <div id = "example"></div>
   <script type="text/babel">
      ReactDOM.render(
            <h1>Hello,World!</h1>,
            document.getElementById(‘example‘)
      );
   </script>
</body>
</html>

然后用浏览器打开就可以了(这里假设你已经会使用IntellJ IDEA,如果不会就先使用Sublime Text),然后在浏览器里面就可以看到你特别熟悉的Hello,World!了。

简单分析一下这个程序,首先,head里面引入了三个js文件。前两个是react的js文件,你可以在目录三里面的下载相关库里面拿。还有一个是browser.min.js,为什么要引入这个js可以参考这个提问,其实是为了将JSX语法转换成JavaScript语法。可以百度谷歌一下,下载该文件,也可以直接引用网上资源。然后就在html里面写了一个script代码块:

<script type="text/babel">
   ReactDOM.render(
         <h1>Hello,World!</h1>,
         document.getElementById(‘example‘)
   );
</script> 

这里需要注意:首先,/h1>后面是此外,以前我们可能使用的是type是text/javascript,现在我们使用的text/babel。这是因为React独有的JSX语法,跟JavaScript不兼容,凡是使用JSX的地方,都要加上type = “text/babel”。

是不是已经开放蒙圈了,刚才提了好几个JSX,什么是JSX呢?React官方文档里面的解释是:XML语法内部包含JavaScript被叫做JSX。但是我理解的应该是我们直接在JS里面嵌入了HTML,这个就是React提出的叫做JSX的语法吧。这样做的好处就是一个组件的开发过程中,HTML是必不可少的一部分,能够将HTML封装起来才是组件的完全体。JSX语法的产生,让前端实现组件化成为了可能。

JSX的基本语法规则:遇到HTML标签(以<开头),就用HTML规则解析;遇到代码块(以{开头),就用JavaScript规则解析。

在ReactDOM.render里面写了两行,他们的作用就是将h1标题插入example节点。

你也可以直接新建一个js文件,然后将body里script里面的代码直接放到里面,我们可以命名为helloworld.js,然后在head里面导入即可。我比较倾向于这种做法,因为至少html文件不会看着太大,而且方便引入管理。如果其他html也需要改代码块,直接引入即可。

基础语法介绍

1、ReactDOM.render( )

ReactDOM.render是React最基本的语法,用于将模板转换成HTML语言,并插入指定的DOM节点。

ReactDOM.render(
    <h1>Hello,World!</h1>,
    document.getElementById(‘example‘)
);

运行结果如下:

2、map(遍历)

将数组中的元素遍历赋值

var animals = [‘dog‘,‘cat‘,‘pig‘];
ReactDOM.render(
    <div>
        {
            animals.map(function(animal) {
              return <h1>{animal}</h1>
            })
        }
    </div>,
    document.getElementById(‘example‘)
);

从这里开始都是讲React代码放到了.js文件里面,然后在html文件里面引入。引入的时候记得写type = ’text/babel’。这里会有一个小问题:打开浏览器的调试工具后,里面会看到Warning如下:

Warning: Each child in an array or iterator should have a unique "key" prop. Check the top-level render call using <div>

解决方法如下:

var animals = [‘dog‘,‘cat‘,‘pig‘];
ReactDOM.render(
    <div>
        {
            animals.map(function(animal,key) {
              return <h1 key = {key}>{animal}</h1>
            })
        }
    </div>,
    document.getElementById(‘example‘)
);

警告的意思是最好给循环产生的child添加一个key。这样就可以接触警告了。运行结果如下:

这里面你也许还会遇到另外一个问题,那就是用的Sublime Text,然后太浏览器打开的时候提示:

browser.min.js:3 XMLHttpRequest cannot load file:///Users/**/***/React/MyReactDemo/helloworld/src/helloworld.js. Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https, chrome-extension-resource.

其实是因为我们将js单独拉出来文件导致的,但是你会发现如果使用Safari浏览器是没有这个问题的。在这里找到了答案:

startup chrome with --disable-web-security
On Windows:

chrome.exe --disable-web-security

On Mac:

open /Applications/Google\ Chrome.app/ --args --disable-web-security

因为Chrome浏览器不支持本地ajax访问。

你也可以构建本地服务器进行访问,比如我使用的intellJ IDEA ,直接就是在本地构建了一个本地服务,此时访问地址为:

http://localhost:63342/MyReactDemo/helloworld/src/helloworld.html

而没有构建本地服务的时候访问地址为:

file:///Users/zhanggui/zhanggui/React/MyReactDemo/helloworld/src/helloworld.html

3、组件化

因为React使用的是JSX,所以它允许将代码封装成组件(component),然后像普通的HTML标签一样插入。

React.createClass方法就是用于生成一个组件类,比如:
var ZGButton = React.createClass({
    render:function() {
        return <button>ZG{this.props.name}</button>
    }
});
ReactDOM.render(
    <ZGButton name = ‘Button1‘/>,
    document.getElementById(‘example‘)
);
 

运行结果如下:

上面的ZGButton就是一个组件类,模板插入<ZGButton />,会自动生成一个该组件的实例。

所有组件类都必须有自己的render方法,用于输出组件。

现在代码这样写:

var zGButton = React.createClass({
    render:function() {
        return <button>ZG{this.props.name}</button>
    }
});
ReactDOM.render(
    <zGButton name="Button2">Button</zGButton>,
    document.getElementById(‘example‘)
);

也就是将组件类的第一个字符小写,然后在引用的时候发现现在是双标签了(代码自动填充的时候出现),而且name失效。因此我们在开发组件的时候一定要将第一个首字符大写,否则将不会达到你想要的效果。

4、this.props.children

this.props对象的属性和组件的属性一一对应,但是有个children除外,它表示的是组件的所有子节点:

var Students = React.createClass({
    render:function() {
        return (
            <ol>
                {
                    React.Children.map(this.props.children,function(child) {
                        return <li>{child}</li>
                    })
                }
            </ol>
        );
    }
});
ReactDOM.render(
    <Students>
        <span>zhangsan</span>
        <span>lisi</span>
    </Students>,
    document.getElementById(‘example‘)
);

此时输出的结果为:

5、PropTypes

组件就类似与我们OC开发或者Java开发中的类,类可以进行属性添加,组件也可以。

组件的属性可以接受任意值,字符串、对象、函数都行。这里面有一个propTypes,可以用来限定提供的属性是否满足要求:

var Student = React.createClass({
    propTypes: {
      myName:React.PropTypes.string.isRequired,
    },
    render:function() {
        return <h1>
            {this.props.myName}
        </h1>
    }
});
var myNameStr = "React";
ReactDOM.render(
    <Student myName = {myNameStr} />,
    document.getElementById(‘example‘)
);

这里面的propTypes里面的是对属性的限制,比如这里必须是string类型,值是必须的。我们还可以去设置默认属性值:

var Student = React.createClass({
    getDefaultProps: function() {
        return {
            myName:"Default React"
        }
    },

    propTypes: {
      myName:React.PropTypes.string.isRequired,
    },
    render:function() {
        return <h1>
            {this.props.myName}
        </h1>
    }
});

这里面的getDefaultProps就类似与我们在开发iOS或者Java的时候对声明属性的时候进行赋初始化值。

6、Virtual DOM

组件并不是真实的DOM节点,而是存在于内存中的一种数据结构,叫做虚拟DOM,只有插入文档的时候才会变成真实的DOM。根据React的设计,当重新渲染组件的时候,会通多diff寻找到变更的DOM节点,再把这个修改更新到浏览器实际的DOM节点上,所以实际上并不是渲染整个DOM数,这个Virtual DOM是一个纯粹的JS数据结构,性能比原生DOM快很多。这里面我们可以用通过ref属性来获取真实的DOM属性:

var MyComponment = React.createClass({
    render:function(){
        return (
          <div>
              <input type = "text" ref = "myTextInput"/>
              <input type = "button" value = "Focus the text input" onClick={this.handleClick}/>
          </div>
        );
    },
    handleClick:function() {
        // alert(this.refs.myTextInput);
        this.refs.myTextInput.focus();
    }
});
ReactDOM.render(
    <MyComponment/>,
    document.getElementById(‘example‘)
);

这里需要注意的是,因为我们使用的是真实的DOM对象,所以一定要确保DOM插入文档之后才能够使用。

7、this.state

我们可以通过this.state来拿到组件的状态:

var LinkButton = React.createClass({
    getInitialState:function () {
      return {linked:false};
    },
    handleClick:function() {
        this.setState({linked:!this.state.linked});
    },
    render:function() {
        var text = this.state.linked? ‘linked‘:‘not linked‘;
        return (
            <p onClick={this.handleClick}>
                You {text} this. Click to toggle
            </p>
        );
    }
});
ReactDOM.render(
    <LinkButton/>,
    document.getElementById(‘example‘)
);

这里面我设置了一个linked的状态(是否连接),这里通过this.state拿到当前状态,通过this.setState来设置状态。

8、表单

表单填写是用户和组件的互动:

var Form = React.createClass({
    getInitialState:function() {
        return {value:‘Hello‘};

    },
    handleChange:function(event) {
        this.setState({value:event.target.value});
    },
    render:function() {
        var value = this.state.value;
        return (
            <div>
                <input type="text" value = {value} onChange={this.handleChange}/>
                <p>{value}</p>
            </div>

        );
    }
});
ReactDOM.render(
    <Form/>,
    document.getElementById(‘example‘)
);

9、Component Lifecycle

组件有三个主要的生命周期:

Mounting:组件插入到DOM

Updating:组件被重新渲染,如果DOM需要更新

Unmounting:从DOM中删除组件

React为每个状态都提供了两种处理函数,will函数在进入状态之前调用,did在进入状态之后调用。详情可参见这里

var MyButton = React.createClass({

    componentDidMount:function() {
        alert("已经装载");
    },
    componentWillMount:function() {
        alert("将要装载");
    },
    componentWillUpdate:function() {
        alert("将要更新");
    },
    componentDidUpdate:function() {
        alert("已经更新");
    },
    componentWillUnmount:function() {
        alert("将要移除");
    },
    render:function(){
        return (
            <button>MyButton</button>
        );
    },
});
var LoadButton = React.createClass({
    loadMyButton:function() {
      ReactDOM.render(
          <MyButton/>,
          document.getElementById(‘myBTN‘)
      );
    },
    removeMyButton:function() {
        var result = ReactDOM.unmountComponentAtNode(document.getElementById(‘myBTN‘));
        console.log(result);
    },
    render:function() {
        return (
            <div>
                <button onClick={this.removeMyButton}>卸载MyButton</button>
                <button onClick={this.loadMyButton}>装载MyButton</button>
                <div id="myBTN">这里是mybuttonquyu</div>
            </div>

        );
    }
});
ReactDOM.render(
    <LoadButton/>,
    document.getElementById(‘example‘)
);

10、Ajax

组件的数据通常是通过Ajax请求服务器获取的,可以使用componentDidMount方法来设置Ajax请求,等到请求成功,再用this.setState方法重新渲染UI:

var UserGist = React.createClass({
    getInitialState:function() {
        return {
            username:‘‘,
            lastGistUrl:‘‘
        }
    },
    componentDidMount:function(){
        $.get(this.props.source,function(result){
            var lastGist  = result[0];
            if (this.isMounted()) {
                this.setState({
                        username:lastGist.owner.login,
                        lastGistUrl:lastGist.html_url
                }
                );
            }
        }.bind(this));
    },
    render:function() {
        return (
            <div>

                    {this.state.username}‘s last gist is
                    <a href={this.state.lastGistUrl}>here</a>

            </div>
        );
    }
});
ReactDOM.render(
    <UserGist source = "https://api.github.com/users/octocat/gists"/>,
    document.getElementById(‘example‘)
);

这里使用了$,所以要引入jquery.js。

总结

经过这两天的了解,大概对React入门了。个人觉得React就是为了组件化开发方便而产生的。利用React,可以让其充当MVC中V的角色。也是对MVC架构的辅助设计。

原文地址:https://www.cnblogs.com/zz191308/p/12515348.html

时间: 2024-08-10 07:35:09

React的开发基础入门的相关文章

MTK开发基础入门教程

这几天在网上翻转好几遍,对于MTK初学者来说,这一份文档确实有用,从开发环境搭建开始描述,到自己在MTK平台写hello world,所以在这平台给大家分享一下,大家也可以在闯客网技术论平台分享自己的心得.MTK交流群:813238832完整资料链接:https://bbs.usoftchina.com/thread-200626-1-1.html 部分内容:一.开发环境设立1.开发主机要求及所需工具:操作系统:Windows 2000, WinXP. 推荐Windows 2000 with S

12-ESP8266 SDK开发基础入门篇--PWM,呼吸灯

https://www.cnblogs.com/yangfengwu/p/11094085.html PWM其实没有什么,就是看着官方给的API,,,然后就是用呗 对了,其实对于RTOS SDK版本的开发可以直接去参考非RTOS SDK的API  这个直接有例子 其实嵌入操作系统也没有什么,底层自带的外设硬件功能该怎么样还是怎么样,操作系统也不能改变什么,,操作系统的存在只是去操作咱定义的函数,让这些函数执行的时候快速的切换执行... 我直接说第三个参数 第三个参数是说要定义一个 这样的数组  

21-ESP8266 SDK开发基础入门篇--C# TCP客户端 , 控制LED亮灭

https://www.cnblogs.com/yangfengwu/p/11192603.html 由于是台式机,,没有插无线网卡...所以呢我就用调试助手监控下数据 后期让WIFI连接路由器的时候,在一个局域网内再和开发板联合测试 我就做的尽量简单点 那个CRC还需要再往后放一放,,,,,,需要和WiFi一块...现在我台式机不能连接WiFi信号,所以,,,,,再等一等 大家如果是笔记本 ,可以连接WiFi的无线,,然后 测试就可以 原文地址:https://www.cnblogs.com/

19-ESP8266 SDK开发基础入门篇--C# TCP客户端编写 , 连接和断开

https://www.cnblogs.com/yangfengwu/p/11130428.html 渐渐的看过去,,,好多节了... 这节做一个C# TCP客户端 新建项目啥子的就不详细截图写了,自行看前面了解 (我的文章只要是有序号的,必须要看前面,因为我所写的教程即是基础又是综合) 先做个这个页面,先做连接和断开 链接TCP用这个变量 其实连接TCP 几句就完了 我定义了一个函数是因为,其实连接时阻塞的,,所以咱需要开个任务 C# 的任务是这样用 OK  现在测试 由于我是用的台式机,,没

26-ESP8266 SDK开发基础入门篇--编写WIFI模块 SmartConfig/Airkiss 一键配网

https://www.cnblogs.com/yangfengwu/p/11427504.html SmartConfig/Airkiss 配网需要APP/微信公众号,这节大家先使用我做好的APP/微信公众号 APP下载: https://www.cnblogs.com/yangfengwu/p/11249674.html 微信公众号: 扫描这个二维码关注我的公众号      其余的步骤等写完8266的配网程序,在下面演示. 如果想自己实现微信绑定可以看↓ (注:配置过程和源码全部是公开的,大

完整Android开发基础入门博客专栏

博客地址:http://www.runoob.com/w3cnote/android-tutorial-contents.html

6-ESP8266 SDK开发基础入门篇--操作系统入门使用

https://www.cnblogs.com/yangfengwu/p/11080567.html 了解了8266的串口了,这一节咱就自己写程序,处理一下数据,如果接收到 0xaa 0x55 0x01  就控制指示灯亮 0xaa 0x55 0x00  就控制指示灯灭 注意哈,我是用的假设没有操作系统的思路,其实如果有了操作系统应该用操作系统提供的API实现 因为8266是用的FreeRtos,,,我还没有深入了解这个系统,所以我先用我的方式实现,后期的文章可能需要等些时间更新了,因为我需要充电

7-ESP8266 SDK开发基础入门篇--串口处理数据,控制LED

https://www.cnblogs.com/yangfengwu/p/11087467.html 接着上一节的写 咱先做一个单片机串口接收到什么就回过来什么 咱自己写个发送函数,其实就是仿照官方的写的 别忘了 现在咱建个任务处理串口数据 下载进去 现在是三个任务都在运行了...操作系统是不是很神奇 现在做这个 咱就控制GPIO5.咱把这里屏蔽掉 现在做处理,,,其实很简单 现在下载进去 OK 了 下一节,咱做一个上位机来控制 https://www.cnblogs.com/yangfengw

20-ESP8266 SDK开发基础入门篇--C# TCP客户端编写 , 加入数据通信

https://www.cnblogs.com/yangfengwu/p/11192594.html 自行调整页面 连接上以后主动发个数据 namespace TCPClient { public partial class Form1 : Form { private TcpClient myTcpClient = null;// TcpClient Thread ConnectThread;//连接线程 string ipAddress;//记录ip地址 int Port = 0;//端口号