2015-11-30 14 views
42

Tôi đang thử bit React.js đầu tiên của mình và được sắp xếp sớm vào ... Tôi có mã bên dưới, biểu mẫu tìm kiếm này sẽ được chuyển thành <div id="search"></div>. Nhưng nhập vào hộp tìm kiếm sẽ không làm gì cả.Không thể nhập vào trường văn bản Phản hồi đầu vào

Có lẽ có điều gì đó đang thiếu đi qua các đạo cụ và trạng thái lên xuống, và điều này có vẻ như là một vấn đề phổ biến. Nhưng tôi đang bối rối - tôi không thể thấy những gì còn thiếu.

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') 
); 

(Cuối cùng tôi sẽ có các loại SearchFacet* nhưng Tôi chỉ cố gắng để có được một này làm việc.)

+0

Thử đăng nhập 'this' khi bạn nhập trường văn bản. Có thể là 'this' không phải là thành phần 'Searcher' nữa. – FaureHu

+0

Cảm ơn FaureHu - đăng nhập 'this' tại thời điểm nào trong mã? Cố gắng đăng nhập từ 'Searcher.handleUserInput()' hoặc 'SearchFacet.handleChange()' không làm gì cả. –

+0

bạn có thể thấy câu trả lời của tôi cho các câu hỏi tương tự. Bạn có thể tìm thấy giải thích chi tiết: http://stackoverflow.com/questions/34713718/input-field-doesnt-receive-keyboard-events-when-rendering-with-value-property/36871399?noredirect=1#comment61310144_36871399 –

Trả lời

35

Trong

render: function() { 
    return (
    <div> 
     Search for: 
     <input 
     type="text" 
     value={this.props.searchString} 
     ref="searchStringInput" 
     onchange={this.handleChange} /> 
    </div> 
); 
} 

Bạn chưa cased đúng tài sản onchange của bạn. Nó cần phải là onChange - hãy thử điều đó và xem liệu nó có gọi trình xử lý hay không.

Cập nhật, kể từ khi câu hỏi này có rất nhiều quan điểm và cung cấp một chút về bối cảnh thêm là có giá trị:

Chủ đề của đi qua một prop value một <input>, và sau đó bằng cách nào đó thay đổi giá trị thông qua để phản hồi tương tác của người dùng bằng cách sử dụng trình xử lý onChange được xem là khá tốt trong the official docs.

Chúng tham chiếu đến các đầu vào như Controlled Components và tham chiếu đến các yếu tố đầu vào thay vì cho phép DOM xử lý nguyên bản giá trị của đầu vào và các thay đổi tiếp theo từ người dùng là Uncontrolled Components.

108

Sử dụng value={whatever} sẽ làm cho nó nên bạn không thể gõ trong lĩnh vực đầu vào. Bạn nên sử dụng defaultValue="Hello!".

Xem https://facebook.github.io/react/docs/uncontrolled-components.html#default-values

Ngoài ra, onchange nên onChange như @davnicwil chỉ ra.

+1

Trong yêu cầu tôi muốn nhập vào lĩnh vực với gõ cho phép cũng như nó cần phải được thiết lập để giá trị mặc định đến từ một biến nhà nước. defaultValue thuộc tính là tốt nhưng có một vấn đề trong việc cập nhật giá trị mặc định theo thay đổi trạng thái, là có một số cách để buộc giá trị mặc định để thay đổi? – semira

+1

Bạn nên đăng vấn đề đó như một câu hỏi khác trên Stackoverflow. – Ivan

+1

@GeoffreyHale Tôi không hoàn toàn chắc chắn ý bạn là gì bởi nó gây hiểu lầm như thế nào. Xem ví dụ này không sử dụng trạng thái: https://codepen.io/anon/pen/BQJZwr?editors=0010. Hoặc điều này có: https://codepen.io/anon/pen/JbMJMX?editors=0010 – Ivan

2

Điều này có thể do hàm onChange không cập nhật đúng giá trị được đề cập trong đầu vào.

Ví dụ:

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

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

trong hàm onChange cập nhật các trường giá trị đề cập.

+0

Cảm ơn, rất hữu ích. Chỉ câu trả lời của bạn giải thích đầy đủ cách giải quyết vấn đề. – Andras

1

Tôi cũng có cùng một vấn đề và trong trường hợp của tôi tôi tiêm giảm tốc đúng cách nhưng tôi vẫn không thể nhập vào trường. Hóa ra nếu bạn đang sử dụng immutable bạn phải sử dụng 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 */ 

Chú ý rằng trạng thái của bạn nên được như state->form nếu không bạn phải cấu hình một cách rõ ràng thư viện cũng là tên cho nhà nước nên form. xem điều này issue

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