无法在 React 输入文本字段中输入

IT技术 javascript reactjs
2021-03-01 19:18:30

我正在尝试我的第一个 React.js 并且很早就被难住了......我有下面的代码,它将搜索表单呈现为<div id="search"></div>. 但是在搜索框中输入没有任何作用。

据推测,向上和向下传递props和状态会丢失某些东西,这似乎是一个常见问题。但我很难过 - 我看不到缺少什么。

var SearchFacet = React.createClass({
  handleChange: function() {
    this.props.onUserInput(
      this.refs.searchStringInput.value
    )
  },
  render: function() {
    return (
      <div>
        Search for:
        <input
          type="text"
          value={this.props.searchString}
          ref="searchStringInput"
          onchange={this.handleChange} />
      </div>
    );
  }
});

var SearchTool = React.createClass({
  render: function() {
    return (
      <form>
        <SearchFacet 
          searchString={this.props.searchString}
          onUserInput={this.props.onUserInput}
         />
        <button>Search</button>
      </form>
    );
  }
});

var Searcher = React.createClass({
  getInitialState: function() {
    return {
      searchString: ''
    }
  },

  handleUserInput: function(searchString) {
    this.setState({
      searchString: searchString
    })
  },

  render: function() {
    return (
      <div>
        <SearchTool 
          searchString={this.state.searchString}
          onUserInput={this.handleUserInput}
        />
      </div>
    );
  }
});

ReactDOM.render(
  <Searcher />,
  document.getElementById('searcher')
);

(最终我会有其他类型的,SearchFacet*但我只是想让这个工作。)

6个回答

使用value={whatever}将使您无法在输入字段中输入。你应该使用defaultValue="Hello!".

https://facebook.github.io/react/docs/uncontrolled-components.html#default-values

此外,onchange应该onChange像@davnicwil 指出的那样。

@GeoffreyHale 我不太确定你所说的误导是什么意思。请参阅此不使用状态的示例:codepen.io/anon/pen/BQJZwr?editors=0010或者这个:codepen.io/anon/pen/JbMJMX?editors=0010
2021-04-22 19:18:30
@Ivan 这个只是帮助了我 非常感谢你defaultValue拯救了我的一天。
2021-05-03 19:18:30
在我的要求中,我想输入带有类型 enable 的字段,并且需要将其设置为来自状态变量的默认值。defaultValue 属性很好,但是根据状态变化更新默认值有问题,有什么方法可以强制更改默认值吗?
2021-05-08 19:18:30
您应该将该问题作为 Stackoverflow 上的另一个问题发布。
2021-05-10 19:18:30
@Ivan 你是对的,两者都是不可变的:value={whatever}value={this.state.myvalue}. 我应该做出这个澄清:使用onChange={this.handleChange}和类似的东西handleChange: function(e) { var newState = {}; newState[e.target.name] = e.target.value; this.setState(newState); },使字段再次可变。
2021-05-11 19:18:30

您没有onchangeinput. 它需要onChange在 JSX 中。

<input
  type="text"
  value={this.props.searchString}
  ref="searchStringInput"
  onchange={this.handleChange} <--[should be onChange]
/>  

valueprop传递给 an <input>,然后以某种方式更改传递的值以使用onChange处理程序响应用户交互的主题在 docs 中得到了很好的考虑

它们将此类输入称为受控组件,并将让 DOM 以本机方式处理输入值和来自用户的后续更改的输入称为不受控制的组件

每当您将valueanprop设置input为某个变量时,您就会拥有一个 Controlled Component这意味着您必须通过某种编程方式更改变量的值,否则输入将始终保持该值并且永远不会更改,即使您键入 - 输入的本机行为,在键入时更新其值,被覆盖在这里react。

因此,您正确地从状态中获取该变量,并有一个处理程序来更新所有设置良好的状态。问题是因为您有onchange而不是正确onChange的处理程序从未被调用,因此value在您输入输入时从未更新。当你使用onChange处理程序调用时,value 当你输入更新,你可以看到你的变化。

对我来说,以下简单的更改效果很好

<input type="text" 
        value={props.letter} 
        onChange={event => setTxtLetter(event.target.value)} /> {/* does not work */}

将... value={myPropVal} 更改为... defaultValue={myPropVal}

<input type="text" 
        defaultValue={props.letter} 
        onChange={event => setTxtLetter(event.target.value)} /> {/* Works!! */}
我认为 onChange 在 Formik 中使用时无法正常工作。我也在尝试这个,但它对我不起作用。你能看看这里吗?stackoverflow.com/questions/61689720/...
2021-04-22 19:18:30

这可能是由于 onChange 函数没有更新输入中提到的正确值。

例子:

<input type="text" value={this.state.textValue} onChange = {this.changeText}></input>

 changeText(event){
        this.setState(
            {textValue : event.target.value}
        );
    }

在 onChange 函数中更新提到的值字段。

如果是无状态组件,则在函数内部;如果是类组件,则在构造函数内部。
2021-05-01 19:18:30
在哪里定义这个changeText func?
2021-05-10 19:18:30
你不需要在 setState 里面写 this.state。如果你只在 setState 里面写 textValue : event.target.value ,它也能完美运行
2021-05-13 19:18:30

defaultValue而不是value对我有用