【问题标题】:Why is only the last input value displayed on screen?为什么屏幕上只显示最后一个输入值?
【发布时间】:2020-05-11 10:17:38
【问题描述】:

我的输入字段有问题。我得到了其中的五个。当我把它们全部填满并按下按钮显示在屏幕上时,所有地方都只显示我输入的最后一个......(这个很难表述,如果你不明白,请问你)

这是我想要输出的时候:

´´´

{this.state.new_array.map((char, i) => (
     <li key={i}>
        {`(${char.gender})
           ${char.name}
           ${char.height}
           ${char.eye_color}
           ${char.birth_year}`}
      </li>

))}

´´´

这是我的输入字段和按钮:

'''

<input  onChange={this.handleChange}></input>
<input  onChange={this.handleChange}></input>
<input  onChange={this.handleChange}></input>
<input  onChange={this.handleChange}></input>
<input  onChange={this.handleChange}></input>
<button onClick={this.addNewCharacter} }>Add character</button>

´´´

这是我连接到按钮和输入的函数:

´´´

 constructor(props){
        super(props);
        this.state = {
            new_array: [],
            nameFromInput: "",
            heightFromInput: "",
            birthyearFromInput: "",
            genderFromInput: "",
            eyecolorFromInput: ""
        }
    }

addNewCharacter = () => {
        this.setState(oldState => ({
            new_array: [...oldState.new_array, { // IM PRETTY SURE IT HAS TO DO WITH THIS FUCNTION?
                name: this.state.nameFromInput, 
                height: this.state.heightFromInput,
                birth_year: this.state.birthyearFromInput,
                gender: this.state.genderFromInput,
                eye_color: this.state.eyecolorFromInput
            }]
        }))
        this.setState({showFavorites: true})
    }

 handleChange = event => {
        this.setState({
            nameFromInput: event.target.value,
            heightFromInput: event.target.value,
            birthyearFromInput: event.target.value,
            genderFromInput: event.target.value,
            eyecolorFromInput: event.target.value});
    }

´´´

【问题讨论】:

    标签: javascript arrays reactjs input


    【解决方案1】:

    为什么要把简单的事情搞得这么复杂?

    这是 Codesandbox https://codesandbox.io/s/serene-hodgkin-d5kz9?file=/src/App.js 中的一个工作示例

    为简洁起见,在下面发布了解决方案:

    import React from "react";
    
    export default class App extends React.Component {
      constructor(props) {
        super(props);
        this.state = {
          name: "",
          height: "",
          birthyear: "",
          gender: "",
          eyecolor: ""
        };
      }
    
      handleChange = event => {
        this.setState({
          name: event.target.value,
          height: event.target.value,
          birthyear: event.target.value,
          gender: event.target.value,
          eyecolor: event.target.value
        });
      };
    
      addNewCharacter = () => {
        const { name, height, birth_year, gender, eye_color } = this.state;
        this.setState({
          new_array: {
            name,
            height,
            birth_year,
            gender,
            eye_color
          },
          showFavorites: true
        });
        console.log(this.state);
      };
    
      render() {
        return (
          <div className="App">
            <input onChange={this.handleChange} />
            <input onChange={this.handleChange} />
            <input onChange={this.handleChange} />
            <input onChange={this.handleChange} />
            <input onChange={this.handleChange} />
            <button onClick={this.addNewCharacter}>Add character</button>
          </div>
        );
      }
    }
    

    【讨论】:

    • 这仍然不起作用,我仍然从最后触摸的输入字段中获取所有位置的值。但是更好的代码!
    • @gospecomid12 最后修改了什么?我不明白
    • 是的,最后编辑的输入字段中的值是显示在所有 5 个输出中的值。假设我将名称编辑为“ooo”,然后“ooo”显示在性别、身高、出生年份......
    • @gospecomid12 我不明白为什么它不起作用?点击codeandbox链接亲自查看:)
    • 看看这个:gyazo.com/50c4658010b504d74a208237cbbe4483 都得到“ooo”,因为我上次写的
    【解决方案2】:

    每次您更改任何输入字段的值时,您都会调用this.handleChange,每次都是同一个函数,输入更改事件作​​为参数传递。

    无论从哪个输入触发此事件,状态中的每个键都会使用来自该输入的值进行更新。

    可能看起来更好一点的是:

    generateHandleChange = key => event => {
      this.setState({[key]: event.target.value});
    };
    

    您的输入将如下所示:

    <input onChange={this.generateHandleChange('name')} />
    <input onChange={this.generateHandleChange('height')} />
    <input onChange={this.generateHandleChange('birth_year')} />
    <input onChange={this.generateHandleChange('gender')} />
    <input onChange={this.generateHandleChange('eye_color')} />
    <button onClick={this.addNewCharacter}>Add character</button>
    

    【讨论】:

    • @gospecomid12 你需要在[key] 后面加上: 而不是,。检查编辑:)
    • 我现在不工作,输入字段没有发送任何内容?只有“……”之间的文字是……岁,有……眼睛”
    • @opr 没关系,我自己想出来的!但是感谢您投入的时间!:)
    猜你喜欢
    • 2017-10-12
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    • 2013-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多