【问题标题】:Simplest high order components and material-ui最简单的高阶组件和材料-ui
【发布时间】:2016-08-03 15:25:52
【问题描述】:

当我直接从我的组件中使用 TextField 时,它工作得非常好(案例 1),但是当我从道具将它包装在函数中(案例 2)时,它在每次更改后失去焦点。

import TextField from 'material-ui/TextField';

var Comp = React.createClass({
    getInitialState: function () {
        return {description: ""};
    },
    descriptionChanged: function (e) {
        this.setState({description: e.target.value});
    },
    render: function () {
        var self = this;
        var T2 = function (props) {
            return <TextField hintText="Desc2"
                              value={self.state.description}
                              onChange={self.descriptionChanged}/>;
        };
        return <div>
            1 <TextField hintText="Desc1"
                       value={self.state.description}
                       onChange={self.descriptionChanged}
            />
            2 <T2/>
        </div>

    }
});

jsfiddle

为什么会这样,我该如何解决?

【问题讨论】:

  • 我建议添加minimal reproducible example,以便我们更好地帮助您。一个 jsfiddle/类似的东西会有很长的路要走。
  • @FrankerZ:用 jsfiddle 更新。

标签: javascript reactjs material-ui


【解决方案1】:

这是因为您在每次渲染时都在创建一个 new 函数(因此是一个新的高阶组件)。 React 会认为这是一种完全不同类型的组件,并且会破坏旧的 DOM 以生成新的。

在这个版本中,我们在创建组件实例时制作一次高阶组件。

import TextField from 'material-ui/TextField';

var Comp = React.createClass({
    getInitialState: function () {
        return {description: ""};
    },
    componentWillMount() {
        // create HOC once for this instance
        var self = this;
        this.T2 = function (props) {
            return <TextField hintText="Desc2"
                              value={self.state.description}
                              onChange={self.descriptionChanged}/>;
        };
    },
    descriptionChanged: function (e) {
        this.setState({description: e.target.value});
    },
    render: function () {
        var self = this;
        var T2 = this.T2;
        return <div>
            1 <TextField hintText="Desc1"
                       value={self.state.description}
                       onChange={self.descriptionChanged}
            />
            2 <T2/>
        </div>

    }
});

【讨论】:

  • 感谢您的回答。你知道有什么方法可以摆脱var T2 = this.T2; 的想法吗?它会大大改善解决方案。
  • 或者,如果它们很少,以某种方式将它们压缩成一个语句。
  • var { T1, T2, T3, T4 } = this; 会将this.T1this.T2this.T3 分配给局部变量...
猜你喜欢
  • 2021-01-26
  • 2020-12-31
  • 1970-01-01
  • 2021-09-02
  • 1970-01-01
  • 2019-07-08
  • 2023-03-23
  • 2021-05-18
  • 2022-01-11
相关资源
最近更新 更多