美文网首页前端文章收集程序员WEB前端程序开发
正确使用react的refs/props/state及其它

正确使用react的refs/props/state及其它

作者: Shannon_JS | 来源:发表于2017-03-04 12:59 被阅读382次

    正确使用refs

    很多人写refs是这么写的(代码仅作演示)

    let Progress = React.createClass({
        show: function(){
            this.refs.modal.show();
        },
        render: function() {
            return (
               <ProgressFormModal ref="modal"/>
            );
        }
    });
    

    但实际上这种写法已不建议使用,正确的写法应该如下:

    let Progress = React.createClass({
        show: function(){
            this.modal.show();//注意这儿的this.refs.modal已被替换成this.modal
        },
        render: function() {
            return (
               <ProgressFormModal ref={ com => { this.modal=com } }/>
            );
        }
    });
    

    官方不建议滥用refs,所以上面的代码其实还可以做优化,用props去更新ProgressFormModal的显示状态

    正确使用props和state

    很多人都知道不能直接修改state的状态

    this.state.comment = 'Hello';//不正确的更新
    

    但对于props和state还是有不少误用,很多人没有意识到props和state可能是异步的,比如:

    //可能失败
    this.setState({
      counter: this.state.counter + this.props.increment,
    });
    

    正确的用法是

    this.setState((prevState, props) => ({
      counter: prevState.counter + props.increment
    }));
    

    另外setState可能不会立即修改this.state,如果你在setState之后立马使用this.state去取值可能返回的是旧的值。setState这个方法其实可以接收两个参数,如下形式:

    setState(nextState, callback)
    

    它接收一个callback,它状态得到更新后,会执行这个callback,不过更推荐在componentDidUpdate中调用相关逻辑

    避免产生新的闭包

    在子组件中,我们要避免以下写法

    <input
                type="text"
                value={model.name}
                onChange={(e) => { model.name = e.target.value }}
                placeholder="Your Name"/>
    

    应该这么写

    <input
                type="text"
                value={model.name}
                onChange={this.handleChange}
                placeholder="Your Name"/>
    

    这样可以避免每次父组件重新渲染的时候,创建新的函数

    相关文章

      网友评论

        本文标题:正确使用react的refs/props/state及其它

        本文链接:https://www.haomeiwen.com/subject/leadgttx.html