zoukankan      html  css  js  c++  java
  • React中props与state

    以下内容均为个人理解。

    1.state:

    在react中,state可以看成管理页面状态的集合(实则一个对象而已),库里面的成员均为页面渲染变量,整个页面为一个状态机,当state发生变化时,页面会重新渲染,页面随state变化而变化。

    2.state如何正确使用:

    const eventsArr = [
        'handleText1Change',
        'handleText2Change',
        'handleText3Change'
    ];
    
    const EmptyString = "";
    
    class Dome extends React.Component {
        constructor(props) {
            super(props);
            this.state = {
                text1: EmptyString,
                text2: EmptyString,
                text3: EmptyString,
                flag: true
            };
            this.setBindFunc();
        };
    
        setBindFunc() {
            eventsArr.forEach(ev => {
                this[ev] = this[ev].bind(this);
            })
        };
    
        handleText1Change(e) {
            this.setState({
                text1: e.target.value
            });
        };
    
        handleText2Change(e) {
            this.state.text2 = e.target.value;
            this.setState({});
        };
    
        handleText3Change(e) {
            this.setState({
                text3: e.tarege.value
            }, () => {
                this.state.flag = false;
            })
        };
    
        render() {
            return <div>
                <input type='text' value={this.state.text1} onChange={this.handleText1Change} />
                <input type='text' value={this.state.text2} onChange={this.handleText2Change} />
                <input type='text' value={this.state.text3} onChange={this.handleText3Change} />
            </div>
        };
    };

    state控制页面渲染,但是只给state赋值是不会导致页面刷新的,只有调用this.setState({})方法后才会执行render方法,最后导致页面重新渲染。

    第一种写法:

    this.setState({text1: e.target.value})为最常规的写法,执行完此方法之后会执行render方法,刷新state中的text1值。但是这里有个问题就是this.setState({})本身作为异步函数,赋值与渲染上会有先后问题,

    在执行this.setState({text1: e.target.value})这个方法是,实际上this.state.text1的值没有改变。当走到render里面的时候this.state.text1的值才会发生改变,render内原则不可以写过多的赋值逻辑,如何解决呢产生方法二。

    第二种写法:

    this.state.text2 = e.target.value; 这种赋值可以直接改变this.state.text2的值,然后调用this.setState({})重新渲染页面,这种方式不会存在异步问题(只要调用this.setState({}),render函数是必然会走的,除非使用

    shouldComponentUpdate来加以限制)。

    第三种写法:

    this.setState({},()=>{})这种赋值与第一种一样,主要侧重在回调函数上,回调函数是在执行完render后执行,回调函数内可以写逻辑,我们拿个简单的赋值举例。这种方式可以控制组件渲染的先后顺序。

    1.props:

    props是组件之间传递数据的媒介。那么在使用props时应该注意哪些。

      1 const
      2     eventsArr = [
      3         'handleText1Change',
      4         'handleText2Change',
      5         'handleText3Change',
      6         'handleText4Change'
      7     ];
      8 
      9 const EmptyString = "";
     10 
     11 class Dome extends React.Component {
     12     constructor(props) {
     13         super(props);
     14         this.state = {
     15             text1: EmptyString,
     16             text2: EmptyString,
     17             text3: EmptyString,
     18             text4: EmptyString,
     19             obj: {
     20                 value: EmptyString
     21             },
     22             flag: true
     23         };
     24         this.setBindFunc();
     25     };
     26 
     27     setBindFunc() {
     28         eventsArr.forEach(ev => {
     29             this[ev] = this[ev].bind(this);
     30         })
     31     };
     32 
     33     handleText1Change(e) {
     34         this.setState({
     35             text1: e.target.value
     36         });
     37     };
     38 
     39     handleText2Change(e) {
     40         this.state.text2 = e.target.value;
     41         this.setState({});
     42     };
     43 
     44     handleText3Change(e) {
     45         this.setState({
     46             text3: e.tarege.value
     47         }, () => {
     48             this.state.flag = false;
     49         })
     50     };
     51 
     52     handleText4Change(oldValue, newValue) {
     53         this.state.text4 = newValue;
     54     };
     55 
     56     render() {
     57         return <div>
     58             <input type='text' value={this.state.text1} onChange={this.handleText1Change} />
     59             <input type='text' value={this.state.text2} onChange={this.handleText2Change} />
     60             <input type='text' value={this.state.text3} onChange={this.handleText3Change} />
     61             <DomeChildren
     62                 text4={this.state.text4}
     63                 obj={this.state.obj}
     64                 handleText4Change={this.handleText4Change}
     65             />
     66         </div>
     67     };
     68 };
     69 
     70 const
     71     Constants = {
     72         Click: 'Click'
     73     };
     74 
     75 class DomeChildren extends React.Component() {
     76     constructor(props) {
     77         super(props);
     78         this.state = {
     79             text: this.props.text4,
     80             obj: this.props.obj
     81         };
     82     };
     83 
     84     handleText4Change(e) {
     85         let
     86             oldValue = this.state.text,
     87             newValue = e.target.value;
     88         this.state.text = newValue;
     89         this.setState({});
     90         this.props.handleText4Change(oldValue, newValue);
     91     };
     92 
     93     handleClick() {
     94         //仅做例子用
     95         this.props.text4 = "Dqhan";
     96         this.props.obj.value = 10086;
     97     }
     98 
     99     render() {
    100         return <div>
    101             <input type='text' value={this.state.text} handleText4Change={this.handleText4Change.bind(this)} />
    102             <div onClick={this.handleClick.bind(this)}>{Constants.Click}</div>
    103         </div>;
    104     };
    105 };

    首先props是用于组件之间传递信息的,比如父组件Dome传递给子组件DomeChildren了text4,obj跟一个方法handleText4Change,这里我们达到了props作用的目的,当子组件内执行handleText4Change,改变了DemoChildren里面的text值同时渲染该组件,这里没有影响到Demo,同时DomeChildren将oldValue与newValue通过传递的handleText4Change方法暴露给了Demo,达到了父给子传递,子给父传递的,子组件渲染没有影响到父级的目的,我理解这是最正确的传递方式以及组件之间的关系。当执行handleClick方法时,可以看到代码执行this.props.text4="Dqhan"时react会报错,这说明props是不可以改变的,但是this.props.obj.value = 10086没有报错,很明显,因为obj是对象,这里我理解为,只要物理地址没有变,react就会认为是props没有改变,不然很多地方用到了数组就没招了。总结:props中简单类型不能改变,引用类型内部的属性可以改变。

    补充一下,创建组件时用的ES6语法class关键字,熟悉服务器语言的都知道,一个类是通常情况下实例化然后才能使用的(除工具类等),而react中<Demo />便是实例化这个组件(react自己封装的)得出一个对象。

  • 相关阅读:
    angular 中如何使用自定义组件
    angular组件数据和事件
    angular组件数据
    angular绑定数据
    angular自定义组件
    angular项目目录结构分析
    Angular 开发工具介绍
    从Microsoft.AspNet.Identity看微软推荐的一种MVC的分层架构
    EF How to use context.Set and context.Entry, which ships with EF4.1 ?
    C# 向IQueryable添加一个Include扩展方法
  • 原文地址:https://www.cnblogs.com/moran1992/p/6796480.html
Copyright © 2011-2022 走看看