javascript - 用空字符串 react 受控组件输入值

标签 javascript reactjs react-native

我在下面为测试 React controlled component input 特性写了一个 demo。但似乎有一个错误。

class TestComponent extends React.Component{
  constructor() {
    super();
    this.state = {value: 'beef'};
    this.handleValueChange = this.handleValueChange.bind(this);
  }
  
  handleValueChange(e) {
    this.setState({value: e.target.value});
  }
  render() {
    return <div>
      <div><input type='text' value={'hello world'} onChange={this.handleValueChange}/></div>
      <div><input type='text' value={''} onChange={this.handleValueChange}/></div>
      <div><input type='text' value={this.state.value} onChange={this.handleValueChange}/></div>
      <div><input type='text' value={null} onChange={this.handleValueChange}/></div>
      <div><input type='text' value={undefined} onChange={this.handleValueChange}/></div>
      <hr/>  
      <div><input type='text' defaultValue={this.state.value} onChange={this.handleValueChange}/></div>
      <p>{this.state.value}</p>
    </div>
  }
}

ReactDOM.render(
  <TestComponent />,
  document.body
)
<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>

第一个 input 指定字符串值属性。当我输入内容时,调用 handleValueChange 函数,结果是 hello world + your type thing's first character

第二个 input 具有空字符串值属性。当我输入内容时,它会调用 handleValueChange 函数,但最后,它总是给我一个字符。

这很奇怪。

更新了! 我用 defaultValue 添加了一个 input,与 value={this.state.value} 比较,我的脑袋乱了..

最佳答案

如您的问题下方的评论所述:删除 value={''} 因为这会在每次呈现时清空输入。

来自react docs ,正确的做法是

return <div>
  <input type='text' value={this.state.value} onChange={this.handleValueChange}/>
  <p>{this.state.value}</p>
</div>

这样,每当您在输入区域中键入内容时,您都会更新状态中设置的值。

如果你想渲染状态中设置了值的组件,你可以使用:

getInitialState() {
  return { value: 'Your default value'}
}

或者,如前所述,使用 defaultValue

在这里阅读更多:https://facebook.github.io/react/docs/forms.html


更新:

根据您更新的问题,我认为您必须了解在渲染函数期间设置值的实际作用。每当您在渲染函数期间设置一个值时,您都会将输入字段“锁定”为该特定值。这意味着用户输入对呈现的元素没有影响。来自文档:“用户输入对呈现的元素没有影响,因为 React 已声明该值”

要解决此问题,您必须将值设置为可以动态更改的值,在您的情况下为 valuethis.state.value。就像您在第三个示例中所做的那样:

<input type='text' value={this.state.value} onChange={this.handleValueChange}/>

通过这种方式,React 接受用户输入提供的值,然后更新组件的值。

我仍然认为文档非常清楚地说明了这一点,我认为您应该阅读我的原始答案中提供的文档。


更新 2

稍微理清controlleduncontrolled部分:

controlled 组件是分配了 value 属性的组件,它将反射(reflect)用户输入的值(value prop ).

虽然 uncontrolled 组件没有分配任何 value 属性,并且不会反射(reflect)用户输入的值(因为它不提供任何 value Prop )。但是如果你想用一个值实例化一个uncontrolled组件,你应该使用defaultValue

在您的情况下(因为您尝试使用 CONTROLLED 组件),这意味着您不应使用 defaultValue,并坚持正确实现 controlled 组件。这是一个使用 value={this.state.value} 的实现。

我再次建议阅读提供的文档。如果您设法理解文档,实际上并不难。

希望这能解决你们中的一些问题! :)

关于javascript - 用空字符串 react 受控组件输入值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39222467/

相关文章:

javascript - map 未显示在网页上(Google map /地点 API)

javascript - Parse 在 React Native 中找不到 localStorage 变量

reactjs - Redux Thunk `([arg(s)]) => dispatch =>` 的用途?

javascript - 如何使用对象的对象渲染 React Native 平面列表?

typescript - React Native bug - 数字文字后面不允许直接使用标识符

javascript - 如何从 ImmutableJS 中对象内部的数组中删除元素

javascript - 在 Bootstrap-select 中动态选择多个值不起作用

javascript - 扩展 YUI3 插件和类

ruby-on-rails - 使用 React 前端和 Rails 后端的带有 google calendar api 的客户端 OAuth

html - TailwindCSS 中的图库卡片尺寸相同