ไม่สามารถพิมพ์ในช่องป้อนข้อความตอบสนอง


111

ฉันพยายามที่บิตแรกของ React.js และกำลังนิ่งงันในช่วงต้น ... <div id="search"></div>ฉันมีโค้ดด้านล่างซึ่งทำให้ฟอร์มการค้นหาลงใน แต่การพิมพ์ในช่องค้นหาไม่ทำอะไรเลย

มีบางอย่างที่อาจขาดหายไปโดยผ่านอุปกรณ์ประกอบฉากและขึ้นลงและดูเหมือนว่าจะเป็นปัญหาทั่วไป แต่ฉันนิ่งงัน - ไม่เห็นว่ามีอะไรหายไป

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

(ในที่สุดฉันก็จะมีประเภทอื่นSearchFacet*แต่ฉันแค่พยายามทำให้อันนี้ใช้งานได้)


ลองบันทึกthisเมื่อคุณป้อนฟิลด์ข้อความ อาจเป็นได้ว่าthisไม่ใช่Searcherส่วนประกอบอีกต่อไป
FaureHu

ขอบคุณ FaureHu - บันทึกthisที่จุดใดในรหัส? พยายามออกจากระบบSearcher.handleUserInput()หรือSearchFacet.handleChange()ไม่ทำอะไรเลย
Phil Gyford

คุณสามารถดูคำตอบของฉันสำหรับคำถามที่คล้ายกัน สามารถดูคำอธิบายโดยละเอียดได้ที่stackoverflow.com/questions/34713718/…
prudhvi seeramreddi

คำตอบ:


81

คุณไม่ได้ใส่onchangeเสาของคุณอย่างถูกต้องในไฟล์input. ต้องอยู่onChangeใน JSX

<input
  type="text"
  value={this.props.searchString}
  ref="searchStringInput"
  onchange={this.handleChange} <--[should be onChange]
/>  

หัวข้อของการผ่านvalueเสาไปยัง<input>แล้วอย่างใดเปลี่ยนค่าผ่านในการตอบสนองต่อการโต้ตอบผู้ใช้ใช้onChangeจัดการสวยทั้งพิจารณาในเอกสาร

พวกเขาอ้างถึงปัจจัยการผลิตเช่นการควบคุมส่วนประกอบและอ้างถึงปัจจัยการผลิตที่แทนให้ DOM กำเนิดจัดการการป้อนข้อมูลที่คุ้มค่าและต่อมามีการเปลี่ยนแปลงจากผู้ใช้เป็นที่ไม่สามารถควบคุมส่วนประกอบ

เมื่อใดก็ตามที่คุณตั้งvalueเสาของinputตัวแปรบางคุณมีชิ้นส่วนที่ควบคุม ซึ่งหมายความว่าคุณต้องเปลี่ยนค่าของตัวแปรด้วยวิธีการทางโปรแกรมมิฉะนั้นอินพุตจะเก็บค่านั้นไว้ตลอดเวลาและจะไม่เปลี่ยนแปลงแม้ว่าคุณจะพิมพ์ก็ตาม - พฤติกรรมดั้งเดิมของอินพุตเพื่ออัปเดตค่าในการพิมพ์จะถูกแทนที่โดย React ที่นี่

ดังนั้นคุณจึงนำตัวแปรนั้นออกจากสถานะได้อย่างถูกต้องและมีตัวจัดการเพื่ออัปเดตสถานะทั้งหมดที่ตั้งค่าได้ดี ปัญหาเกิดจากคุณมีonchangeและไม่onChangeเคยเรียกตัวจัดการที่ถูกต้องและvalueไม่เคยมีการอัปเดตเมื่อคุณพิมพ์ลงในอินพุต เมื่อคุณใช้onChangeตัวจัดการจะถูกเรียกตัวจัดการจะvalue ถูกอัปเดตเมื่อคุณพิมพ์และคุณจะเห็นการเปลี่ยนแปลงของคุณ


201

การใช้value={whatever}จะทำให้คุณไม่สามารถพิมพ์ในช่องป้อนข้อมูลได้ คุณควรใช้defaultValue="Hello!".

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

นอกจากนี้onchangeควรเป็นไปonChangeตามที่ @davnicwil ชี้ให้เห็น


2
ในความต้องการของฉันฉันต้องการป้อนฟิลด์ด้วยการเปิดใช้งานการพิมพ์และจำเป็นต้องตั้งค่าเป็นค่าเริ่มต้นมาจากตัวแปรสถานะ แอตทริบิวต์ defaultValue ใช้ได้ดี แต่มีปัญหาในการอัปเดตค่าเริ่มต้นตามการเปลี่ยนแปลงสถานะมีวิธีบังคับให้เปลี่ยนค่าเริ่มต้นหรือไม่
semira

1
คุณควรโพสต์ปัญหานั้นเป็นคำถามอื่นใน Stackoverflow
Ivan

1
@GeoffreyHale ฉันไม่ค่อยแน่ใจว่าคุณหมายถึงอะไรเพราะมันทำให้เข้าใจผิด ดูตัวอย่างนี้ที่ไม่ได้ใช้รัฐ: codepen.io/anon/pen/BQJZwr?editors=0010 หรือสิ่งนี้ที่ทำ: codepen.io/anon/pen/JbMJMX?editors=0010
Ivan

4
@ อีวานคุณพูดถูกทั้งคู่ไม่เปลี่ยนรูป: value={whatever}และ value={this.state.myvalue}. ฉันควรชี้แจงเรื่องนี้แทน: การใช้onChange={this.handleChange}และอะไรก็ตามที่handleChange: function(e) { var newState = {}; newState[e.target.name] = e.target.value; this.setState(newState); },ทำให้ฟิลด์ไม่แน่นอนอีกครั้ง
Geoffrey Hale

1
@Ivan คนนี้ช่วยฉันด้วยขอบคุณมากdefaultValueช่วยวันของฉัน
Code Cooker

11

ซึ่งอาจเกิดจากฟังก์ชัน onChange ไม่ได้อัปเดตค่าที่เหมาะสมซึ่งระบุไว้ในอินพุต

ตัวอย่าง:

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

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

ในฟังก์ชัน onChange ให้อัพเดตฟิลด์ค่าที่กล่าวถึง


ขอบคุณมีประโยชน์มาก มีเพียงคำตอบของคุณเท่านั้นที่อธิบายวิธีแก้ปัญหาได้อย่างครบถ้วน
M3RS

จะกำหนด func changeText นี้ได้ที่ไหน
Jitendra Pancholi

หากเป็นส่วนประกอบที่ไม่มีสถานะภายในฟังก์ชันและหากเป็นส่วนประกอบของคลาสภายในตัวสร้าง
Gal Grünfeld

คุณไม่จำเป็นต้องเขียน this.state ภายใน setState หากคุณเขียนเฉพาะ textValue: event.target.value ภายใน setState มันก็ทำงานได้อย่างสมบูรณ์เช่นกัน
Pardeep Sharma

4

ฉันก็มีปัญหาเดียวกันเช่นกันและในกรณีของฉันฉันฉีดยาลดอย่างถูกต้อง แต่ฉันก็ยังพิมพ์ฟิลด์ไม่ได้ แต่กลับกลายเป็นว่าคุณกำลังใช้คุณต้องใช้immutableredux-form/immutable

import {reducer as formReducer} from 'redux-form/immutable';
const reducer = combineReducers{

    form: formReducer
}
import {Field, reduxForm} from 'redux-form/immutable';
/* your component */

ขอให้สังเกตว่ารัฐของคุณควรจะเป็นเหมือนมิฉะนั้นคุณจะต้องปรับแต่งอย่างชัดเจนห้องสมุดยังเป็นชื่อของรัฐควรจะเป็นstate->form formดูปัญหานี้


4

สำหรับฉันการเปลี่ยนแปลงง่ายๆต่อไปนี้ทำงานได้อย่างสมบูรณ์แบบ

<input type="text" 
        value={props.letter} 
        onChange={event => setTxtLetter(event.target.value)} /> {/* does not work */}

เปลี่ยน ... value = {myPropVal} เป็น ... defaultValue = {myPropVal}

<input type="text" 
        defaultValue={props.letter} 
        onChange={event => setTxtLetter(event.target.value)} /> {/* Works!! */}

สิ่งนี้แก้ไขให้ฉันขอบคุณ!
mikeym

ฉันคิดว่า onChange ทำงานไม่ถูกต้องเมื่อใช้ภายใน Formik ฉันก็พยายามเช่นกัน แต่มันไม่ได้ผลสำหรับฉัน คุณช่วยดูที่นี่ได้ไหม stackoverflow.com/questions/61689720/…
a125

0

ในบริบทส่วนประกอบของคลาส ...

หากเมธอด changeHandler เป็นฟังก์ชันปกติ:

handleChange(e){
    this.setState({[e.target.name]:[e.target.value]});
}

ก็ใช้ได้เช่นนี้ ...onChange={(e)=>this.handleChange(e)}

<input type="text" name="any" value={this.state.any} onChange={(e)=>this.handleChange(e)}></input>

ถ้าเมธอด changeHandler เป็นฟังก์ชันลูกศร:

handle = (e) =>{
        this.setState({[e.target.name]:[e.target.value]});
    }

ก็ใช้ได้แบบนี้ ... onChange={this.handle}

 <input type="text" name="any2" value={this.state.any2} onChange={this.handle} ></input>

และสิ่งนี้ช่วยแก้ปัญหา "Can't type in React input text field" ของฉัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.