【问题标题】:Why can't I pass state via props to a controlled text component?为什么我不能通过道具将状态传递给受控文本组件?
【发布时间】:2017-02-16 16:16:23
【问题描述】:

我很困惑为什么 React 坚持要我给我的受控文本输入组件自己的内部状态。我按照官方文档创建了一个受控输入,而 React 通过控制台对我大喊大叫:

*warning.js:36 警告:ClientInfoTextInput 正在更改要控制的文本类型的不受控制的输入。输入元素不应从不受控切换到受控(反之亦然)。决定在组件的生命周期内使用受控输入元素还是不受控输入元素。

render() {
    return (
      <input type="text"
        className={styles.ClientInfoTextInput}
        value={this.props.propToPass} 
        onChange={this.props.propMethodToPass}
      />
    )

那么,为什么我不能通过 props 将状态传递给受控的输入组件而不让 React 不高兴呢?

【问题讨论】:

  • 如果不显示完整的组件代码,就很难判断。组件名称是 ClientInfoTextInput 吗?如果是这样,我认为您的问题是初始化时“this.props.propToPass”未定义。您可以检查未定义,如果是,则传递默认值。
  • 请显示整个文件,这样我们更容易理解发生了什么。 @ericg 说的很可能是你的问题,但在我们看到更多内容之前我们不会知道

标签: reactjs


【解决方案1】:

如果不查看完整代码就很难调试您的组件,但是通过 props 将状态传递给受控输入组件的一种方法如下:http://codepen.io/PiotrBerebecki/pen/bwLjaE

class App extends React.Component {
  constructor() {
    super();
    this.state = {
      textInParent: ''
    };
    this.handleTextFromChild = this.handleTextFromChild.bind(this);
  }

  handleTextFromChild(data) {
    this.setState({
      textInParent: data
    });
  }

  render() {
    return (
      <div>
        <InputForm propMethodToPass={this.handleTextFromChild}
                   propToPass={this.state.textInParent} /> 
      </div>
    );
  }
}


class InputForm extends React.Component {
  render() {
    return (
      <div>
        <input type="text"
               value={this.props.propToPass}
               onChange={(event) => this.props.propMethodToPass(event.target.value)} />
        <p>Text received from Parent via props: {this.props.propToPass}</p>
      </div>
    );
  }
}


ReactDOM.render(
  <App />,
  document.getElementById('app')
);

【讨论】:

  • Sneetches,你想让我回答任何问题还是给你解决方案?
  • 是的,Piotr Berebecki,这很好。不过,就像一个普遍的问题一样,React 文本输入元素没有自己的输入值内部状态是否是一种反模式?我问是因为我看到提到“UI 状态”,这意味着否则“呈现”元素应该有自己的内部状态,以立即显示用户输入更改。但是,另一方面,对于其值仅与其远祖相关的单独输入具有自己的内部状态(如我的代码中的情况)似乎很愚蠢。那么这里的正确模式是 UI 状态还是通过 props 传递?
  • 我倾向于接受 React Docs 的建议并保持 UI 状态。这也可能对您的考虑有用:facebook.github.io/react/tips/… 他们解释说“如果您明确表示道具只是组件内部控制状态的种子数据,这不是反模式”。也可以在这里看看:spraso.com/managing-react-controlled-component-state
  • 帅哥!现在我了解了它的目的,我实际上真的很喜欢 UI 状态的想法,所以我将使用它 + 一个受控组件,并通过基于 props 的 onClick 函数将 UI 状态传递给父级。非常感谢!
猜你喜欢
  • 2020-08-07
  • 2016-10-19
  • 2017-08-22
  • 1970-01-01
  • 2020-10-08
  • 1970-01-01
  • 1970-01-01
  • 2017-11-19
  • 1970-01-01
相关资源
最近更新 更多