React

React 构建开发环境

1.先打开 cmd 命令行全局安装 react
npm install -g create-react-app
2.在你要安装的文件夹下面 git Bash Here,创建 hello-world 项目
create-react-app hello-world

image.png

3.进入到项目主页面
npm start
image.png

页面上有这个时,项目搭建成功。

1.React 简介

1.React起源于 facebook 的内部项目,因为该公司对市场上所有的 JavaScript MVC 框架都不满意,就决定自己写一套,用来架设 instagram 的网站,做出来以后发现这套东西很好用,就在2013年5月开源了。
2.React 把用户界面抽象成一个个组件 如 按钮组件 Button,对话框组件 Dialog 。开发者通过组合这些组件,最终得到功能丰富,可交互的页面。通过引入JSX 语法 复用组件变得非常容易,同时也能保证组件结构清晰。

2.虚拟DOM

DOM 操作非常昂贵,我们都知道在前段开发中,性能消耗最大的就 DOM 操作,而且这部分代码会让整体项目的代码变得难以维护,react 把真实的 Dom 树转化成 JavaScript 对象树,也就是虚拟 Dom 。


image.png

虚拟 DOM 由于是 js 变量,所以它的操作效率是非常高的。App可以 n 次操作虚拟 DOM ,虚拟 DOM 一次性反映到真实 DOM 里。这样就把过去 n 操作 Dom 简化为一次 DOM 操作。从而尽大可能的提高了整个页面的刷新效率。避免了性能的浪费。

3.JSX 语法

1.基本语法

定义标签时只允许被一个标签包裹。
标签一定要闭合

image.png

2.元素类型

小写首字母对应 DOM 元素
大写首字母对应 组件元素
注释使用 js 注释方法

3.元素属性

class 属性改为 className
for 属性改为 htmlFor
Boolean 属性:默认值为 true

4.JavaScript 表达式

属性值要使用表达式,只要用 { } 替换 “ ” 即可。

5.组件的使用

1.定义组件


image.png

2.显示 Hello 组件


image.png

3.组合使用组件


image.png

4.调用属性

class TOdoList extends Component{
  render(){
    return(
      <div>
        <h2>{this.props.title}</h2> //调用组件值
        <input type="text" /><br/>
          <ul>
            <li>第一个TODO</li>
            <li>第二个TODO</li>
            <li>第三个TODO</li>
            <li>第四个TODO</li>
          </ul>
      </div>
    )
  }
}

class App extends Component {
  render() {
    return (
    <div>
          <TOdoList title="TOdoList测试标题"/>  // 引用组件,设置值
    </div>
    )
  };
}

6.状态-state

react 里只需要更新组件 state ,然后根据新的 state 重新渲染用户界面(不用操作 DOM)

1.重要的方法

  • getlnitialState:定义初始状态 (ES6 中已不再使用,改成在 constructor 中设定 )
  • this.state:读取状态
  • this.setState :更新组件的状态
class TOdoList extends Component{
  constructor(){                                                  //构造器
    super();                                                        //执行父类的构造器
    this.state={                                                   //设置初始state
      list:["第一个","美美哒","就是我"]
    }
  }
  render(){
    return(
      <div>
        <h2>{this.props.title}</h2>
        <input type="text" /><br/>
          <ul>
           {                                                          //读取state
             this.state.list.map((item,index)=>{
                return <li key={item}>{item}</li>
             })
           }
          </ul>
      </div>
    )
  }
}

7.事件绑定

1.事件 —— 使用发生在组件上的事件
事件绑定写法 onClick,注意:必须写成驼峰形式,即事件的首字母要大写。
2.得到在浏览器上显示的元素 - refs

class TOdoList extends Component{
  constructor(){       //构造器
    super();           //执行父类的构造器
    this.state={       //设置初始state
      list:["第一个","美美哒","就是我"]
    }
    //推荐这种指针修正方式
    this.addTOdo=this.addTOdo.bind(this);
  }
  addTOdo (){   //点击的方法
    console.log(this.refs.todoval.value);
    this.state.list.push(this.refs.todoval.value) //将输入框的 value 值 push 到 list 数组中
    this.setState({     //更新页面
     list:this.state.list
   })  
  }
  render(){
    return(
      <div>
        <h2>{this.props.title}</h2>
        <input type="text" ref="todoval" />
        <button onClick={this.addTOdo}>ADD TODO</button>  //绑定点击事件
        <br/>
          <ul>
           {   //读取state
             this.state.list.map((item,index)=>{
                return <li key={item}>{item}</li>
             })
           }
          </ul>
      </div>
    )
  }
}

8.子组件向父组件传值

  • 在父组件中定义一个设置state的方法,然后把这个方法通过属性传递给子组件。
  • 在子组件中调用这个方法,把值传入就可以了。
class TOdoList extends Component {  //子组件
  constructor() {       //构造器
    super();           //执行父类的构造器
    this.state = {       //设置初始state
      list: ["第一个", "美美哒", "就是我"]
    }
    //推荐这种指针修正方式
    this.addTOdo = this.addTOdo.bind(this);
  }
  addTOdo() {
    console.log(this.refs.todoval.value);
    this.state.list.push(this.refs.todoval.value) //将输入框的value值push到list数组中
    this.setState({     //更新页面
      list: this.state.list
    })
  }
  render() {
    return (
      <div>
        <h2>{this.props.title}</h2>
        <input type="text" ref="todoval" />
        <button onClick={this.addTOdo}>ADD TODO</button>
        <button onClick={() => { this.props.sendDatefromchild("这是来自于子组件的问候") }}>子到父</button>  // 调用 sendDatefromchild 方法并传参
        <br />
        <ul>
          {   //读取state
            this.state.list.map((item, index) => {
              return <li key={item}>{item}</li>
            })
          }
        </ul>
      </div>
    )
  }
}

class App extends Component {  //父组件
  constructor() {
    super();
    this.sendDatefromchild = this.sendDatefromchild.bind(this);  //绑定 sendDatefromchild 方法
    this.state = {                 //初始化state
      message: "hello world"
    }
  }

  sendDatefromchild(val) {  //sendDatefromchild 方法
    this.setState({                //页面更新 message
      message: val
    })
  }

  render() {
    return (
      <div>
        <h1>{this.state.message}</h1>
        <TOdoList title="TOdoList测试标题" sendDatefromchild={this.sendDatefromchild} />   //把方法 sendDatefromchild 通过属性传给子组件
      </div>
    )
  };
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容

  • 原教程内容详见精益 React 学习指南,这只是我在学习过程中的一些阅读笔记,个人觉得该教程讲解深入浅出,比目前大...
    leonaxiong阅读 2,834评论 1 18
  • 以下内容是我在学习和研究React时,对React的特性、重点和注意事项的提取、精练和总结,可以做为React特性...
    科研者阅读 8,232评论 2 21
  • $ 前言   最近在考虑框架转型,鉴于作为一名JSer,要时时刻刻保持对新技术和流行技术的敏感性,而 React、...
    果汁凉茶丶阅读 22,000评论 5 32
  • 2018年1月15 凌晨04:50 杭州转塘 1我怎么如此幸运?终于,这个山脚下,半夜醒来~天气没有了那份刺骨的寒...
    吴桂仪阅读 170评论 0 2
  • 这些日子,心情时好时坏。好的时候,觉得晴空万里,幸福无比。差的时候,又觉得心灰意冷,一切都没有意义。我一直以为自己...
    绽蕊向阳阅读 396评论 0 1