2015-02-12 24 views
30

Tôi đã tạo danh sách TODO đơn giản này và khi tôi muốn chọn hộp kiểm tôi không thể.React.js không thể thay đổi trạng thái hộp kiểm

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; 

Phụ huynh:

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; 

Trả lời

37

Khi bạn đã không được xác định một handler onChange trên đầu vào của bạn Phản ứng sẽ làm cho lĩnh vực đầu vào như read-only.

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

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

Mua tại sao tôi phải làm điều này? tôi không cần onChange xử lý, những gì tôi cần phải viết bên trong xử lý này? – Bazinga

+4

Bạn cần nó vì React mong đợi một. Đó là những gì được gọi là đầu vào được kiểm soát hoặc không kiểm soát được. Đọc tại đây, tại http://facebook.github.io/react/docs/forms.html –

+0

Tôi đã thử nghiệm phương pháp này nhưng nó không hoạt động đối với mã của tôi. Tôi đang sử dụng thành phần Hộp kiểm từ Giao diện người dùng Material. – Casper

5

Đây là một trong những hit hàng đầu trên Google cho "Phản ứng Component không cập nhật", vì vậy mặc dù câu trả lời đã được chấp nhận tốt, tôi nghĩ rằng nó có thể gây hiểu nhầm.

Loại checkbox không yêu cầu onChange. Tôi không chắc chắn nếu điều này đã thay đổi kể từ khi câu trả lời đã được đăng (phiên bản hiện tại của React là v15 - 2016-04-20).

Xem ví dụ sau của nó làm việc mà không có một handler onChange (xem 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); 

Một mặt lưu ý - rất nhiều câu trả lời (đối với câu hỏi tương tự) chỉ đơn giản là giới thiệu "defaultChecked" - mặc dù công trình này, nó thường là một thước đo một nửa.

+0

defaultChecked hoạt động tốt cho tôi ngay bây giờ, nhờ –

+0

Câu trả lời ở trên cho biết rằng không có trình xử lý "OnChanged", hộp kiểm sẽ được hiển thị chỉ đọc. Khi tôi nhấp vào JSBin của bạn, đó là hành vi chính xác tôi thấy: khi tôi nhấp vào hộp kiểm chính nó (không phải là liên kết), không có gì xảy ra với trạng thái đã chọn. Đây có phải là kỳ vọng của bạn không? – BenjiFB

+0

Có. Quan điểm của tôi là "onChange" không được yêu cầu để làm cho nó trở thành một thành phần có thể chỉnh sửa (không chỉ đọc). Cách bạn kích hoạt thay đổi trạng thái đó (hoặc thông qua hộp kiểm onClick/onChange tùy thuộc vào bạn – Chris

Các vấn đề liên quan