Próbuję mojego pierwszego fragmentu React.js i jestem zaskoczony ... Mam poniższy kod, który renderuje formularz wyszukiwania na <div id="search"></div>
. Ale wpisanie w polu wyszukiwania nic nie daje.
Przypuszczalnie czegoś brakuje podczas przekazywania rekwizytów i stanu w górę iw dół, a to wydaje się być częstym problemem. Ale jestem zaskoczony - nie widzę, czego brakuje.
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')
);
(W końcu będę miał inne rodzaje, SearchFacet*
ale próbuję tylko sprawić, by ten działał.)
javascript
reactjs
Phil Gyford
źródło
źródło
this
podczas wprowadzania pola tekstowego. Być możethis
nie jest toSearcher
już składnik.this
w którym miejscu kodu? Próba zalogowania sięSearcher.handleUserInput()
lubSearchFacet.handleChange()
nic nie daje.Odpowiedzi:
Nie umieściłeś poprawnie swojego
onchange
rekwizytu winput
. Musi byćonChange
w formacie JSX.Temat przekazywania właściwości
value
do an<input>
, a następnie w jakiś sposób zmienianie wartości przekazywanej w odpowiedzi na interakcję użytkownika za pomocąonChange
procedury obsługi jest dość dobrze rozważany w dokumentacji .Odnoszą się do takich danych wejściowych, jak Komponenty kontrolowane , a do danych wejściowych, które zamiast tego pozwalają modelowi DOM natywnie obsługiwać wartość wejściową i późniejsze zmiany wprowadzone przez użytkownika jako Komponenty niekontrolowane .
Ilekroć ustawiasz właściwość
value
aninput
na jakąś zmienną, masz komponent kontrolowany . Oznacza to, że musisz zmienić wartość zmiennej za pomocą jakichś programowych środków, w przeciwnym razie wejście zawsze będzie zawierało tę wartość i nigdy się nie zmieni, nawet gdy wpiszesz - natywne zachowanie wejścia, aby zaktualizować jego wartość przy wpisywaniu, jest nadpisywane przez React here.Więc poprawnie pobierasz tę zmienną ze stanu i masz program obsługi, który zaktualizuje stan, wszystko skonfigurowane poprawnie. Problem polegał na tym, że masz
onchange
i nie poprawnyonChange
program obsługi nigdy nie był wywoływany, a więcvalue
nigdy nie był aktualizowany podczas wpisywania danych wejściowych. Kiedy używaszonChange
programu obsługi jest wywoływany,value
jest aktualizowany podczas wpisywania i widzisz zmiany.źródło
Użycie
value={whatever}
spowoduje, że nie będzie można wpisywać w polu wejściowym. Powinieneś użyćdefaultValue="Hello!"
.Widzieć https://facebook.github.io/react/docs/uncontrolled-components.html#default-values
Ponadto,
onchange
powinny byćonChange
jak @davnicwil zaznacza.źródło
value={whatever}
ivalue={this.state.myvalue}
. Zamiast tego powinienem uczynić to wyjaśnienie : używanieonChange={this.handleChange}
i cokolwiek podobnegohandleChange: function(e) { var newState = {}; newState[e.target.name] = e.target.value; this.setState(newState); },
sprawia, że pola są ponownie zmienne.defaultValue
ocal mój dzień.Może to być spowodowane tym, że funkcja onChange nie aktualizuje prawidłowej wartości, która jest podana w danych wejściowych.
Przykład:
w funkcji onChange zaktualizuj wspomniane pole wartości.
źródło
Ja też mam ten sam problem iw moim przypadku prawidłowo wtrysnąłem reduktor ale nadal nie mogłem wpisać w pole. Okazuje się, że jeśli używasz
immutable
, musisz użyćredux-form/immutable
.Zauważ, że twój stan powinien wyglądać tak, jak w
state->form
przeciwnym razie musisz jawnie skonfigurować bibliotekę, a także powinna być nazwa stanuform
. zobacz ten problemźródło
U mnie następująca prosta zmiana zadziałała idealnie
źródło
W kontekście komponentu klasy ...
Jeśli metoda changeHandler jest normalną funkcją:
może być używany tak jak ten ...
onChange={(e)=>this.handleChange(e)}
Jeśli metoda changeHandler jest funkcją strzałkową:
można go używać w ten sposób ...
onChange={this.handle}
I to rozwiązało mój problem „Nie można wpisać pola tekstowego w Reakcie”.
źródło