相信大家对框架这个词都很熟悉吧,我一直喜欢js原生来开发,但是目前都要求工作效率,所有使用框架或者是库会使我们开发更加方便和快速,甚至一个人干十个人的活。。

框架优点:

1.方便开发、快速写功能
  2.统一开发方式
  3.调试、测试方便

前端三大框架:

Angular.js-前端三大框架之1
  vue.js-前端三大框架之2
  react.js-前端三大框架之3

大家都知道,我们web开发会和后台配合,之前不分前后台,一直是一起,后来为了方便和高效,就分离了。

MVC:前后台分离

M-Model 模型:数据 后台
  V-View 视图:表现层 前台
  C-Controller 控制器:业务逻辑

mvc很多衍生概念:mvvc、mvvp、mvn、mvvcp等,其中angular和vue都是这一类。

但是今天主讲的不是他俩,是目前比较火的react,这个一般适用于中大型项目,当核心框架来使用,而且可以和别的框架完美的配合。

不啰嗦,直接开始正题React:

重点:组件、状态
  核心:状态

1.JSX(babel、browser)
  JSX:可以把HTML直接写JS里
2.react
  React特点:虚拟DOM

react主要就是使用jsx语法,是白了就是在js中直接编写html,是不是很方便很溜。。下面直接开始写法:

使用react首先需要引三个文件:
  browser.js 它的作用是使浏览器支持babel
  react.js 这个不用说,react主体文件
  react-dom.js 这个是react的虚拟DOM的文件编译dom的

1.定义组件——组件(这个就用到了ES6中的class的写法):

class 名字 extends React.Component{
  constructor(...args){
   super(...args);
  }
  render(){
   return <span>aaa</span>; //return出去你要在页面展示的标签
  }
}

2.使用组件

就跟标签一样用
  ReactDOM.render(
   <span>111</span>, //可以直接写标签,(渲染什么东西)
   oDiv  (要放到哪里)
  );

ReactDOM.render(
   <Comp/>, //也可以使用class,注意,使用的时候直接把class当做标签来用。
   oDiv
  );

比如先写一个简单的例子吧:
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title></title>
  6. <script src="js/browser.js" charset="utf-8"></script>
  7. <script src="js/react.js" charset="utf-8"></script>
  8. <script src="js/react-dom.js" charset="utf-8"></script>
  9. <script type="text/babel">
  10. class Box extends React.Component{
  11. constructor(...args){
  12. super(...args)
  13. }
  14. render(){
  15. return <div> //注意 最外层元素有且只有一个(必须有,而且只能有一个)
  16. <span>我的名字是李鹏</span><br/>
  17. <span>我今年24岁</span>
  18. </div>
  19. }
  20. }
  21. window.onload=function(){
  22. var oDiv=document.getElementById("div1");
  23. ReactDOM.render(
  24. <Box/>, //注意:需要和上面class的名字一样
  25. oDiv
  26. )
  27. };
  28. </script>
  29. </head>
  30. <body>
  31. <div id="div1">
  32. </div>
  33. </body>
  34. </html>
注意:定义的时候 render出去的最外层元素有且只有一个(必须有,而且只能有一个)使用的时候直接把组件名字当做标签来用,需要和上面class的名字一样。

那么有人会说了,那么能往组件身上存放一些数据吗?答案是可以,
使用的时候,直接往组件标签身上加入属性即可,定义的时候使用就直接调用,注意是在this.props的身上:

  1. class Box extends React.Component{
  2. constructor(...args){
  3. super(...args)
  4. }
  5. render(){
  6. return <div>
  7. <span>我的名字是{this.props.name}</span><br/>
  8. <span>我今年{this.props.age}岁</span>
  9. </div>
  10. }
  11. }
  12. window.onload=function(){
  13. var oDiv=document.getElementById("div1");
  14. ReactDOM.render(
  15. <Box name="李鹏" age="24"/>,
  16. oDiv
  17. )
  18. };

那么react比如我往一个元素节点身上加入数据怎么做,正常一个组件中的数据,不可能是不变的吧,肯定是从后台过来的,这就关系到状态的变化。

注意:状态是活的,会变化的,怎么用呢?
  定义:constructor里面——this.state={};
  变化:方法里面——this.setState({});

使用的时候:直接用模板即可:{} 注意是单括号。比如:
  1. <span>输入框输入的是:{this.state.value}</span>
在React中怎么往组件this身上加入一些数据呢?

答案:使用 this.state={value:'',name:''} 注意是={} 一个json 多了就往后加

  1. class Box extends React.Component{
  2. constructor(...args){
  3. super(...args);
  4. this.state={value:''};
  5. }
  6. }

正常我们修改this的属性,直接改就行,但是react中你要修改必须设置状态:this.setState({this.value='',this.name=''});

  1. this.setState({
  2. value:ev.target.value
  3. });

那么怎么在React组件中加入事件呢,直接加即可,不过注意:

比如:正常的 onclick 我们要写成 onClick,正常的onchange 写成 onChange 等。

那么组件中事件怎绑定函数呢?直接告诉你吧:onChange={this.fn.bind(this)} 注意加上bind,为了防止this指向错乱。

比如写一个吧:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title></title>
  6. <script src="js/browser.js" charset="utf-8"></script>
  7. <script src="js/react.js" charset="utf-8"></script>
  8. <script src="js/react-dom.js" charset="utf-8"></script>
  9. <script type="text/babel">
  10. class Box extends React.Component{
  11. constructor(...args){
  12. super(...args);
  13. this.state={value:''};
  14. }
  15. fn(ev){
  16. this.setState({
  17. value:ev.target.value
  18. });
  19. }
  20. render(){
  21. return <div>
  22. <input type="text" onChange={this.fn.bind(this)} />
  23. <span>输入框输入的是:{this.state.value}</span>
  24. </div>
  25. }
  26. }
  27. window.onload=function(){
  28. var oDiv=document.getElementById("div1");
  29. ReactDOM.render(
  30. <Box/>,
  31. oDiv
  32. )
  33. };
  34. </script>
  35. </head>
  36. <body>
  37. <div id="div1">
  38. </div>
  39. </body>
  40. </html>

下面就写一个比较简单的例子吧,用react做一个时钟吧:

不过介绍这个之前要介绍几个东西,因为做时钟的话,肯定要用定时器吧,间隔是1000,也就是1s,所以也没会有一个间隔,这样不完美,正常我们写的话,肯定直接先把函数调用一遍吧,但是在react中不行,因为组件是有生存周期的,如果你在组件没有渲染到页面就直接调用,那样是没办法的,因为代码是一步一步往下走的,所以介绍几个东西吧:

  1.   componentWillMount() 创建之前
  2.   componentDidMount() 创建之后
  3.   componentWillUpdate() 更新之前
  4.   componentDidUpdate() 更新之后
  5.   componentWillUnmount() 卸载之前
  6.   componentWillReceiveProps() 组件参数更新

直接看例子吧:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title></title>
  6. <script src="js/browser.js" charset="utf-8"></script>
  7. <script src="js/react.js" charset="utf-8"></script>
  8. <script src="js/react-dom.js" charset="utf-8"></script>
  9. <script type="text/babel">
  10. class Close extends React.Component{
  11. constructor(...args){
  12. super(...args);
  13. this.state={
  14. h:0,
  15. m:0,
  16. s:0
  17. };
  18. setInterval(()=>{
  19. this.fn();
  20. },1000)
  21. }
  22. toDub(a){
  23. return a<10?"0"+a:a+'';
  24. }
  25. componentDidMount(){ //在组件创建之后直接调用这个方法一次,省的页面出现00:00:00的情况
  26. this.fn();
  27. }
  28. fn(){
  29. var oDate=new Date();
  30. this.setState({
  31. h:this.toDub(oDate.getHours()),
  32. m:this.toDub(oDate.getMinutes()),
  33. s:this.toDub(oDate.getSeconds())
  34. })
  35. }
  36. render(){
  37. return <div>
  38. <span>{this.state.h}</span>:
  39. <span>{this.state.m}</span>:
  40. <span>{this.state.s}</span>
  41. </div>
  42. }
  43. }
  44. window.onload=function(){
  45. var oDiv=document.querySelector("#div1");
  46. ReactDOM.render(
  47. <Close/>,
  48. oDiv
  49. )
  50. };
  51. </script>
  52. </head>
  53. <body>
  54. <div id="div1"></div>
  55. </body>
  56. </html>

以上,基本把react框架中的创建组件,使用组件,以及组件身上使用属性,以及状态都简单的说了一下,那么工作中很多时候,我们都会从后台获得一组数据,然后把数据的每一项放到一个标签中,那么在react中该怎么做呢?

比如说有这样一组数据:

  1. constructor(...args){
  2. super(...args);
  3. //this.arr=[1, 5, 8, 9];
  4. this.state={arr: [12, 5, 8, 9]};
  5. }

首先,肯定有人会想到:我直接render出去对应数量的标签,然后把数据通过模板放进去,但是我们不可能手动写很多标签把每一项数据填进去,然后把标签render出去吧,而且数据个数你也不知道,还是变化的,所以我们可以直接循环创建,然后存到一个数组中:

  1. render(){
  2. var result=[];
  3. var arr=this.state.arr;
  4. for(var i=0;i<arr.length;i++){
  5. result.push(<Item key={i} value={arr[i]}/>); //这个Item标签是一个小的组件,我们把数据放到属性身上吧。
  6. }
  7. return <ul>
  8. <input type="button" value="按钮" onClick={this.fn.bind(this)} /> //为了看看状态变化了,页面DOM有没有直接循环加上

  9. {result}
  10. </ul>;
  11. }
  12. //其中Item标签是一个小的组件:
  13. class Item extends React.Component{
  14. constructor(...args){
  15. super(...args);
  16. }
  17. render(){
  18. return <li>{this.props.value}</li>;
  19. }
  20. }

上面的代码意思就是说,我先申明一个数组,然后通过循环把我们从后台获得的数据放到一个标签中,并且push到数组中去,最后把数组render出去,不过要放到模板里面,不能直接把数组render出去,{存放标签的数组名},那么很多人会问,那组件标签上面的key是什么东西呢,这个你就把他理解错id就行,唯一,而且这个是必须要写的,就相当于告诉他,这个我已经创建了,不需要重复创建了

  1. fn(){
  2. this.setState({
  3. arr: this.state.arr.concat([Math.random()])
  4. });
  5. }

这个例子整体代码,大家看一下吧:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title></title>
  6. <script src="js/browser.js" charset="utf-8"></script>
  7. <script src="js/react.js" charset="utf-8"></script>
  8. <script src="js/react-dom.js" charset="utf-8"></script>
  9. <script type="text/babel">
  10. class Item extends React.Component{ //这个组件方便我们下面使用
  11. constructor(...args){
  12. super(...args);
  13. }
  14. render(){
  15. return <li>{this.props.value}</li>;
  16. }
  17. }
  18. class List extends React.Component{
  19. constructor(...args){
  20. super(...args);
  21. //this.arr=[12, 5, 8, 9];
  22. this.state={arr: [12, 5, 8, 9]};
  23. }
  24. fn(){
  25. this.setState({
  26. arr: this.state.arr.concat([Math.random()]) //随便往数组最后添加一项,随机数,注意,不要使用push之类的,直接用数
  27. 组拼接。下面点击测试用。
  28. });
  29. }
  30. render(){
  31. var result=[];
  32. var arr=this.state.arr;
  33. for(var i=0;i<arr.length;i++){
  34. result.push(<Item key={i} value={arr[i]}/>);
  35. }
  36. return <ul>
  37. <input type="button" value="按钮" onClick={this.fn.bind(this)} /> //点击执行一个函数,让数据最后添加一项,看看数
  38. 据变化了,这个组件渲染的页面变化没。
  39. {result}
  40. </ul>;
  41. }
  42. }
  43. window.onload=function (){
  44. var oDiv=document.getElementById('div1');
  45. ReactDOM.render(
  46. <List />,
  47. oDiv
  48. );
  49. }
  50. </script>
  51. </head>
  52. <body>
  53. <div id="div1">
  54. </div>
  55. </body>
  56. </html>

以上,结束。

作者:虚幻的锈色
链接:https://www.jianshu.com/p/d8695c0084e8
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

前端三大框架之一React入门教程的更多相关文章

  1. 前端三大框架Angular & React & Vue

    前端三大框架: Angular[Google]:一套框架,多种平台移动端 & 桌面端.学会用Angular构建应用,然后把这些代码和能力复用在多种多种不同平台的应用上 —— Web.移动 We ...

  2. react 入门教程 阮一峰老师真的是榜样

    -  转自阮一峰老师博客 React 入门实例教程   作者: 阮一峰 日期: 2015年3月31日 现在最热门的前端框架,毫无疑问是 React . 上周,基于 React 的 React Nati ...

  3. React入门教程(二)

    前言 距离上次我写 React 入门教程已经快2个月了,年头年尾总是比较忙哈,在React 入门教程(一)我大概介绍了 React 的使用和一些注意事项,这次让我们来继续学习 React 一. Rea ...

  4. Web前端三大框架_angular.js 6.0(二)

    Web前端三大框架_angular.js 6.0(一) 需要视频教程,看头像昵称处 一.Angular 6.0  1.1样式 html中引入样式:内嵌式,外链式,行内式. ng6中组件引入样式的方式也 ...

  5. React入门教程1---初见面

    React入门教程1---初见面:https://blog.csdn.net/solar_lan/article/details/82799248 React 教程 React 是一个用于构建用户界面 ...

  6. .NET轻量级MVC框架:Nancy入门教程(二)——Nancy和MVC的简单对比

    在上一篇的.NET轻量级MVC框架:Nancy入门教程(一)——初识Nancy中,简单介绍了Nancy,并写了一个Hello,world.看到大家的评论,都在问Nancy的优势在哪里?和微软的MVC比 ...

  7. 【军哥谈CI框架】之入门教程之第二讲:分析CI结构和CI是怎么工作的

    [军哥谈CI框架]之入门教程之第二讲:分析CI结构和CI是怎么工作的   之入门教程之第二讲:分析CI结构和CI是如何工作的大家好!上一节,我们共同部署了一个CI网站,做到这一点非常简单,但是,亲们, ...

  8. 前端三大框架(Angular Vue React)

    前端,HTML(超文本标记语言),CSS(层叠样式表)和JavaScript(脚本语言) HTML,通常说的h5,其实按标准来说,HTML4的后续版本不带编号了,并保证向前的兼容性 CSS的版本3,增 ...

  9. 前端mvc框架backbone.js入门[转]

    原文地址:http://www.cnblogs.com/zhjh256/p/6083618.html 关于backbone.js的优缺点,这里就不详谈了,网上关于这方面的讨论很多了,而且各种框架之所以 ...

随机推荐

  1. 关于chrome控制台警告:Synchronous XMLHttpRequest on the main thread

    Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to th ...

  2. C# .NET ToList()分页

    ViewData.Model = Limodel.ToList().Skip((page - ) * ).Take().ToList(); //page 当前页,10:每页几条数据

  3. 浏览器预览office文件(word,Excel,等)

    提示:预览是通过后台转pdf到前台展示的过程,当然网上也有购买的api 举个栗子:(http://www.officeweb365.com/) <!DOCTYPE html> <ht ...

  4. 3.HTML+CSS 制作个太阳

    效果地址:https://codepen.io/flyingliao/pen/moPBwR HTML code: <div class="sun"></div&g ...

  5. 1.如何在Cloud Studio上执行Python代码?

    1.在python文件下新建python文件,输入文件名后按Enter键生成,比如: one.py . 2.简单输入python代码: print "haha" 3.打开左下角的终 ...

  6. 2.HTML文件中<!DOCTYPE html>的作用

    <!DOCTYPE> 声明位于文档中的最前面的位置,处于 <html> 标签之前.此标签可告知浏 览器文档使用哪种 HTML 或 XHTML 规范.(重点:告诉浏览器按照何种规 ...

  7. <转载> MySQL 性能优化的最佳20多条经验分享 http://www.jb51.net/article/24392.htm

    当我们去设计数据库表结构,对操作数据库时(尤其是查表时的SQL语句),我们都需要注意数据操作的性能.这里,我们不会讲过多的SQL语句的优化,而只是针对MySQL这一Web应用最多的数据库.希望下面的这 ...

  8. shell环境变量

    永久环境变量配置: /etc/profile /etc/bashrc 用户环境变量: ~/.bashrc

  9. Android自定义View学习笔记(一)

    绘制基础 参考:HenCoder Android 开发进阶: 自定义 View 1-1 绘制基础 Paint详解 参考:HenCoder Android 开发进阶: 自定义 View 1-2 Pain ...

  10. compute by 的使用

    GROUP BY子句有个缺点,就是返回的结果集中只有合计数据,而没有原始的详细记录.如果想在SQL SERVER中完成这项工作,可以使用COMPUTE BY子句.COMPTE生成合计作为附加的汇总列出 ...