2015-02-12 11 views
30

Stworzyłem tę prostą listę TODO, a kiedy chcę zaznaczyć pole wyboru, nie mogę.React.js nie może zmienić stanu pola wyboru

import React from 'react'; 

const TodoItem = React.createClass({ 

    render() { 
    return (
     <div> 

     <span>{this.props.todo}</span> 
     <input type="checkbox" checked={this.props.done} /> 

     </div> 
    ); 
    } 

}); 

export default TodoItem; 

Rodzic:

import React from 'react'; 
import TodoItem from './TodoItem'; 
import AddTodo from './AddTodo'; 

const TodoList = React.createClass({ 

    getInitialState() { 
    return { 
     todos: [{ 
     todo: 'some text', 
     done:false 
     },{ 
     todo: 'some text2', 
     done:false 
     }, 
     { 
     todo: 'some text3', 
     done:true 
     }] 
    }; 
    }, 

    addTodo (childComponent) { 
    var todoText = childComponent.refs.todoText.getDOMNode().value; 
    var todo = { 
     todo: todoText, 
     done:false 
    }; 
    var todos = this.state.todos.concat([todo]); 
    this.setState({ 
     todos:todos 
    }); 

    childComponent.refs.todoText.getDOMNode().value = ''; 
    }, 

    render() { 

    var Todos = this.state.todos.map(function(todo) { 
     return (
      <TodoItem todo={todo.todo} done={todo.done} /> 
     ) 
    }); 

    return (
     <div> 
     {Todos} 
     <AddTodo addTodo={this.addTodo}/> 
     </div> 

    ); 
    } 

}); 

export default TodoList; 

Odpowiedz

37

Kiedy nie określił onChange obsługi na twoje wejścia React odda pole wprowadzania jako tylko do odczytu.

getInitialState() { 
    return { 
     done: false 
    }; 
} 

i

<input type="checkbox" checked={this.state.done || this.props.done } onChange={this.onChange} /> 
+5

Kup dlaczego muszę to robić? Nie potrzebuję obsługi Zmień, co muszę napisać wewnątrz tego programu obsługi? – Bazinga

+4

Potrzebujesz tego, ponieważ React oczekuje jednego. To tak zwane kontrolowane lub niekontrolowane wejścia. Przeczytaj tutaj dlaczego, http://facebook.github.io/react/docs/forms.html –

+0

Już testowałem tę metodę, ale nie działa ona dla mojego kodu. Używam komponentu Checkbox z Materialnego interfejsu użytkownika. – Casper

5

Jest to jeden z najlepszych trafień w Google „React składnik nie odnowienia”, więc mimo że odpowiedź została dobrze przyjęta, myślę, że to może być mylące.

Typ checkbox nie wymaga onChange. Nie jestem pewien, czy to się zmieniło od czasu opublikowania odpowiedzi (obecna wersja React to v15 - 2016-04-20).

Zobacz poniższy przykład z nim pracować bez obsługi onChange (patrz JSBIN):

class Checky extends React.Component { 
    render() { 
     return (<input type="checkbox" checked={this.props.checked} />); 
    } 
} 

class App extends React.Component { 

    constructor(props) { 
     super(props); 
     this.state = { checked: true }; 
    } 

    render() { 
     return (
      <div> 
      <a href="#" onClick={() => { this.setState({ checked: !this.state.checked }); }}>Toggle</a> 
      <hr /> 
      <Checky checked={this.state.checked} /> 
      </div> 
     ); 
    } 
} 


React.render(<App />, document.body); 

Kolejna dygresja - wiele odpowiedzi (podobnych pytań) po prostu zalecane „defaultChecked” - chociaż to działa, zazwyczaj jest to połowa.

+0

defaultChecked działa dobrze dla mnie teraz, dzięki –

+0

Powyższa odpowiedź wskazuje, że bez obsługi "OnChanged", pole wyboru będzie renderowane tylko do odczytu. Kiedy klikam twój JSBin, widzę dokładnie to, co widzę: kiedy klikam to pole wyboru (nie link), nic nie stanie się z zaznaczonym stanem. Czy to twoje oczekiwanie? – BenjiFB

+0

Tak. Chodzi mi o to, że "onChange" nie jest wymagane, aby uczynić go edytowalnym (nieczytanym tylko do odczytu) komponentem. Wyzwalanie tej zmiany stanu (za pomocą pola wyboru onClick/onChange zależy od Ciebie – Chris

Powiązane problemy