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


111

我正在尝试使用React.js的第一部分,并且很早就陷入了困境...我有下面的代码,该代码将搜索表单呈现为<div id="search"></div>。但是,在搜索框中输入内容无济于事。

大概在通过道具并上下移动时会丢失一些东西,这似乎是一个常见问题。但是我很沮丧-我看不到缺少的东西。

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*但是我只是想让这一类正常工作。)


this输入文本字段时尝试登录。可能不再this是该Searcher组件了。
FaureHu

谢谢FaureHu- this在代码的哪一点登录?尝试从中登录Searcher.handleUserInput()SearchFacet.handleChange()不执行任何操作。
菲尔·吉福德

您可以看到我对类似问题的回答。:你可以找到详细的解释stackoverflow.com/questions/34713718/...
prudhvi seeramreddi

Answers:


78

您尚未正确将onchange道具放在机箱中input。它必须onChange在JSX中。

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

在文档中充分考虑了将value prop 传递给<input>,然后以某种方式更改响应以使用onChange处理程序响应用户交互而传递的值的主题。

他们将这些输入称为“ 受控组件”,而将使DOM本地处理输入值和随后来自用户的更改的输入称为“非受控组件”

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

因此,您可以正确地从状态中获取该变量,并可以设置一个处理程序来更新状态。问题是因为您拥有onchange并且onChange处理不正确,所以从未调用过该处理函数,因此value当您键入输入时,永远不会更新该处理函数。当你使用onChange处理程序调用时,value 当你输入更新,你可以看到你的变化。


200

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

参见https://facebook.github.io/react/docs/un受控-components.html#default-values

另外,onchange应该是onChange@davnicwil指出的。


2
在我的要求中,我想输入带有使能的字段,并且需要将其设置为来自状态变量的默认值。defaultValue属性很好,但是根据状态更改更新默认值时有问题,是否有某种方法可以强制更改默认值?
Semira

1
您应该将该问题作为另一个问题发布在Stackoverflow上。
伊万

1
@GeoffreyHale我不太确定您的误解是什么意思。请参见以下不使用状态的示例:codepen.io/anon/pen/BQJZwr?editors=0010。或执行此操作的代码:codepen.io/anon/pen/JbMJMX?editors=0010
Ivan

4
@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); },可使字段再次可变。
杰弗里·黑尔

1
@Ivan这个人只是帮助了我,谢谢你defaultValue
电磁炉

10

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

例:

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

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

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


谢谢,非常有帮助。只有您的答案才能完整说明如何解决问题。
M3RS

在哪里定义这个changeText函数?
Jitendra Pancholi,

如果它是一个无状态组件,则在函数内,如果它是一个类组件,则在构造函数内。
GalGrünfeld'19

您无需在setState中编写this.state。如果您仅在setState内编写textValue:event.target.value,那么它也可以正常工作
Pardeep Sharma

4

我也有同样的问题,在我的情况下,我正确地注入了reducer,但仍然无法在字段中键入。事实证明,如果您正在使用immutable,则必须使用redux-form/immutable

import {reducer as formReducer} from 'redux-form/immutable';
const reducer = combineReducers{

    form: formReducer
}
import {Field, reduxForm} from 'redux-form/immutable';
/* your component */

请注意,您的状态应类似于state->form否则,您必须显式配置库,状态的名称也应为form。看到这个问题


4

对我而言,以下简单更改非常有效

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

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

<input type="text" 
        defaultValue={props.letter} 
        onChange={event => setTxtLetter(event.target.value)} /> {/* Works!! */}

这为我解决了。谢谢!
mikeym

我认为在Formik中使用onChange不能正常工作。我也尝试过,但是对我没用。你能在这里看看吗?stackoverflow.com/questions/61689720/...
A125

0

在类组件上下文中...

如果changeHandler方法是常规函数:

handleChange(e){
    this.setState({[e.target.name]:[e.target.value]});
}

可以这样使用...onChange={(e)=>this.handleChange(e)}

<input type="text" name="any" value={this.state.any} onChange={(e)=>this.handleChange(e)}></input>

如果changeHandler方法是箭头函数:

handle = (e) =>{
        this.setState({[e.target.name]:[e.target.value]});
    }

可以这样使用... onChange={this.handle}

 <input type="text" name="any2" value={this.state.any2} onChange={this.handle} ></input>

这解决了我的“无法在React输入文本字段中键入”问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.