Estou tentando minha primeira parte do React.js e estou perplexo no início ... Tenho o código abaixo, que renderiza um formulário de pesquisa em <div id="search"></div>
. Mas digitar na caixa de pesquisa não adianta nada.
Presumivelmente, algo está faltando, passando os adereços e o estado para cima e para baixo, e isso parece um problema comum. Mas estou perplexo - não consigo ver o que está faltando.
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')
);
(Eventualmente terei outros tipos de, SearchFacet*
mas estou apenas tentando fazer este funcionar.)
javascript
reactjs
Phil Gyford
fonte
fonte
this
ao inserir o campo de texto. Pode ser quethis
não seja mais oSearcher
componente.this
em que ponto do código? Tentando logarSearcher.handleUserInput()
ouSearchFacet.handleChange()
não faz nada.Respostas:
Você não encaixou corretamente seu
onchange
suporte noinput
. Precisa estaronChange
em JSX.O tópico de passar uma
value
prop para um<input>
e, em seguida, alterar de alguma forma o valor passado em resposta à interação do usuário usando umonChange
manipulador é muito bem considerado nos documentos .Eles se referem a essas entradas como componentes controlados e se referem a entradas que, em vez disso, permitem que o DOM manipule nativamente o valor da entrada e as alterações subsequentes do usuário como componentes não controlados .
Sempre que você define o
value
prop de uminput
para alguma variável, você tem um componente controlado . Isso significa que você deve alterar o valor da variável por algum meio programático ou a entrada sempre manterá esse valor e nunca mudará, mesmo quando você digitar - o comportamento nativo da entrada, para atualizar seu valor na digitação, é sobrescrito por React aqui.Então, você está retirando corretamente essa variável do estado e tem um manipulador para atualizar o estado, tudo configurado corretamente. O problema era porque você tinha
onchange
e não o correto,onChange
o manipulador nunca estava sendo chamado e, portanto, ovalue
nunca estava sendo atualizado quando você digita na entrada. Quando você usa,onChange
o manipulador é chamado, ovalue
é atualizado quando você digita e você vê suas alterações.fonte
Usar
value={whatever}
fará com que você não possa digitar no campo de entrada. Você deve usardefaultValue="Hello!"
.Consulte https://facebook.github.io/react/docs/uncontrolled-components.html#default-values
Além disso,
onchange
deve seronChange
como @davnicwil aponta.fonte
value={whatever}
evalue={this.state.myvalue}
. Eu deveria ter feito este esclarecimento : o uso deonChange={this.handleChange}
e qualquer coisa semelhantehandleChange: function(e) { var newState = {}; newState[e.target.name] = e.target.value; this.setState(newState); },
torna os campos mutáveis novamente.defaultValue
salve o meu dia.Isso pode ser causado pela função onChange não estar atualizando o valor apropriado que é mencionado na entrada.
Exemplo:
na função onChange atualize o campo de valor mencionado.
fonte
Também estou com o mesmo problema e no meu caso injetei redutor corretamente mas ainda não consegui digitar no campo. Acontece que se você está usando,
immutable
você tem que usarredux-form/immutable
.Observe que seu estado deve ser
state->form
igual, caso contrário, você terá que configurar explicitamente a biblioteca e o nome do estado deve serform
. veja este problemafonte
Para mim, a seguinte mudança simples funcionou perfeitamente
fonte
Em um contexto de componente de classe ...
Se o método changeHandler for uma função normal:
pode ser usado assim ...
onChange={(e)=>this.handleChange(e)}
Se o método changeHandler for uma função de seta:
pode ser usado assim ...
onChange={this.handle}
E isso resolveu meu problema "Não é possível digitar no campo de texto de entrada React".
fonte