【问题标题】:Materialize Css text fields become frozenMaterialize Css 文本字段被冻结
【发布时间】:2017-11-25 02:45:00
【问题描述】:

我在反应中使用物化 css。我已经实现了一个像这样的简单文本字段:

<div class="input-field col s6">
   <input placeholder="Placeholder" id="first_name" type="text" class="validate" value={this.state.name}>
   <label for="first_name">First Name</label>
</div>

该值显示在文本字段中,但我无法编辑该字段。它刚刚被这个价值冻结了。我还在 componentDidMount() 中使用了 Materialize.updateTextFields();。但它没有用。有什么帮助吗?

【问题讨论】:

  • 我对物化不是很熟悉,但我认为您还需要对输入进行 onChange,并为此在回调中更改输入的状态。类似于:&lt;input placeholder="Placeholder" id="first_name" type="text" class="validate" value={this.state.name} onChange={(e) =&gt; { this.setState({ name: e.currentTarget.value }) }}&gt;
  • 嘿,thanx... 它有效.. !

标签: reactjs material-design textfield materialize


【解决方案1】:

由于输入中的值取决于状态,因此您还需要放置一个 onChange 处理程序,以便您可以通过修改状态来更改输入值。

class SimpleInput extends React.Component {
  constructor() {
    super();
    this.state = {
      value: 'walawe'
    }
  }
  
  onChangeValue = (value) => {
    this.setState({
      value,
    })
  }
  
  render() {
    return <input type="text" value={this.state.value} onChange={(e) => this.onChangeValue(e.target.value)}/>
  }
}

ReactDOM.render(<SimpleInput />, document.getElementById('app'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="app"></div>

更新

如果我有很多输入怎么办?我会使用数组来存储输入。请注意输入的顺序很重要。

class SimpleInput extends React.Component {
  constructor() {
    super();
    this.state = {
      values: ['why', 'are', 'you', 'so', 'serious', 'about', 'it', 'all', 'the', 'way']
    }
  }
  
  onChangeValue = (value, i) => {
    this.setState((prevState) => {
      const newValues = prevState.values;
      newValues[i] = value;
      return {
        values: newValues,
      };
    })
  }
  
  render() {
    console.log(this.state.values);
    const inputs = this.state.values.map((val, i) => <div><input type="text" value={val} onChange={(e) => this.onChangeValue(e.target.value, i)}/></div>)
    return (<div>
      {inputs}
    </div>)
  }
}

ReactDOM.render(<SimpleInput />, document.getElementById('app'))
div {
  margin: 10px 0 0 0;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="app"></div>

【讨论】:

  • 好的...谢谢..它的工作。但是,如果我有 10-20 个或更多文本字段怎么办?为每个文本字段创建 10 个状态并不好。另外,如果我不使用状态,而是使用道具,比如 this.props.name 怎么办?
  • @Piyush 为了结束,你能先接受这个答案吗?然后我会告诉你如果有 10-20 个文本字段我会怎么做。
  • @Piyush 添加了一个新代码来按承诺处理大量文本字段
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-24
  • 2015-01-16
  • 1970-01-01
  • 2020-11-11
  • 2016-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多