zoukankan      html  css  js  c++  java
  • React 核心概念(网站整理)

    1、JSX简介---可以很好的描述UI应该呈现他应有交互的本质形式。

         const element = <h1>Hello.world!</h1>;   

         为什么使用JSX?------React认为渲染逻辑本质上与其他UI逻辑内在耦合,但是并没有采用将标记与逻辑进行分离到不同文件的分离方式

    而是将两者共同存放在称之为“组件”的松散耦合单位之中,来实现关注点分离

          

          警告:

          因为JSX语法上更接近JavaScript而不是HTML,所以React DOM 使用 camelCase(小驼峰命名)来定义属性名称,而

    不使用HTML属性名称的命名约定。

         例如: JSX里的class 变成 className ,而tabindex 则变成 tabIndex;

        

         JSX防止注入攻击-----React DOM在渲染所有输入内容之前,默认会进行转义。他可以确保在你的应用中,永远不会

    注入那些并非自己明确编写的内容。所有的内容在渲染之前都被转换成字符串。可以有效防止XSS(cross-site-scripting,跨站脚本)攻击;

          

          Babel会把JSX转义成一个名叫React.createElement()函数调用;

         例如: const element = (<h1 className="greeting">hello,world!</h1>);

         上面代码等同于

          const element = React.createElement('h1',{className:'greeting','hello,world!'});

          上面代码创建的一个这样的对象:

          const element = {

                 type: 'h1',

                 props:{

                      className: 'greeting',

                      children:'hello,world'

                 }

          } 该对象被称之为‘React元素’;


    2、元素渲染

          元素是构成React 应用的最小砖块;与浏览器的DOM元素不同,React元素是创建开销极小的普通对象。React DOM 会负责更新

           DOM 来与React 元素保持一致;

           React 元素是不可变对象;在实践中,大多数React应用只会调用一次ReactDOM.render();

          React只更新它需要更新的部分;


    3、组件&Props

           3.1) 函数组件

           function Welcome(props){

                  return <h1>Hello,{props.name}<h1/>

           }

           3.2) class组件

           class Welcome extends React.Component {

                   render(){

                         return <h1>Hello,{this.props.name}</h1>

                   }

           }

           

          const element = <Welcome name="sara"/>;

          当React元素为用户自定义组件时,他会将JSX所接收的属性转换为单个对象传递给组件,这个对象称之为“props”;

           如: props = { name: 'sara'};

           注意:组件名称必须以大写字母开头;React 会将以小写字母开头的组件视为原生DOM标签。例如:<div/>代表HTML的div标签,

         而<Welcome/>则代表一个组件,并且需要在作用域内使用Welcom;


      4、State & 生命周期

           生命周期  componentDidMount ---代表React元素渲染到DOM中,就会调用该方法;

                          componentWillUnMount ----当React元素从DOM中移除时,就会调用该方法;

           不能直接修改State,而是使用setState();构造函数是唯一可以给this.state赋值的地方;  

              State的更新可能是异步的----出于性能考虑,React 可能会将多个setState()调用合并成一个调用;

            因为this.state和this.props可能会异步更新,所以不要依赖他们的值更新下一个状态;

              //Wrong   -----解决方案:可以让setState()接收一个函数而不是一个对象

              this.setState({

                    counter: this.state.counter + this.props.increment

               })

               //Correct 

              this.setState((state,props)=>({

                     counter:state.counter + props.increment

               }))


    5、事件处理

          1、在React中你不能通过返回false的方式阻止默认行为,必须显示使用preventDefault

            2、使用React时,你一般不需要使用addEventListener为已创建的DOM元素添加监听器。

                 仅仅需要在该元素初始渲染的时候添加一个监听器

           例如:

           <button onClick={(e)=> this.deleteRow(id,e)}>Delete Row</button>

           <button onClick={ this.deleteRow.bind(this,id)}>Delete Row</button>

           上述两种方式是等价的,分别通过箭头函数Function.prototype.bind来实现;

             这两种情况下,React的事件对象e会被作为第二个参数传递。如果通过箭头函数的方式,事件对象必须显示的进行传递

             而通过bind的方式,事件对象以及更多的额参数将会被隐式的进行传递


    6、条件渲染

          if ,运算符&&,三目运算符

            如何阻止组件渲染?  可以让render方法直接返回null


    7、列表&Key

          key只是在兄弟节点之间必须唯一;


    8、表达

          8.1) <input type=‘text’ value={this.state.value} onChange={this.handleChange}/>

            8.2) <textarea value={this.state.value} onChange={this.handleChange}/>

            8.3) <select value='this.state.value' onChange='{this.handleChange}'>

                         <option value='grapefruit'></option>

                         <option value='grapefruit'></option>

                         <option value='grapefruit'></option>

                         <option value='grapefruit'></option>

                 </select>

            注意:可以将数组传递到value属性中,以支持在select标签中选择多个选项;

            <select multiple={true} value={['B','C']};


    9、状态提升

           通常,多个组件需要反映相同的变化数据,这时建议将共享状态提升到最近的共同父组件中。


    10、组合vs 继承       

           React有十分强大的组合模式。我们推荐使用组合而非继承来实现组件间的代码重用;

            10.1)包含关系

                      第一种:使用props.children来将他们的子组件传递到渲染结果中; 

                     第二种: 自行约定:将所需内容传入props,并使用相应的prop

                      {props.left}            left={Contacts}


    12、React哲学

            通过问自己一下三个问题,你可以逐个检查相应数据是否属于state;

              1) 该数据是否由父组件通过props传递而来的?如果是,那他应该不是state;

              2) 该数据是否随时间的推移而保持不变?如果是,那他应该不是state;

              3) 你能否根据其他state或props计算出该数据的值?如果是,那它不是state;

     

               对于应用中的每一个state:

               1)找到根据这个state进行渲染的所有组件;

               2)找到他们的共同所有者(common owner)组件(在组件层级上高于所有需要该state的组件);

               3)该共同所有者组件或者比它层级更高的组件应该拥有state;

               4)如果你找不到一个合适的位置来存放该state,就可以直接创建一个新的组件来存放该state,并将这一新组建置于

    高于共同所有者组件层级的位置;

  • 相关阅读:
    Project Euler 97 :Large non-Mersenne prime 非梅森大素数
    Project Euler 96:Su Doku 数独
    Project Euler 95:Amicable chains 亲和数链
    Project Euler 94:Almost equilateral triangles 几乎等边的三角形
    Project Euler 93:Arithmetic expressions 算术表达式
    Project Euler 92:Square digit chains 平方数字链
    Project Euler 91:Right triangles with integer coordinates 格点直角三角形
    Project Euler 90:Cube digit pairs 立方体数字对
    Project Euler 89:Roman numerals 罗马数字
    Project Euler 88:Product-sum numbers 积和数
  • 原文地址:https://www.cnblogs.com/sunqq/p/10753225.html
Copyright © 2011-2022 走看看