【问题标题】:multiple textfields onChange function issue多个文本字段 onChange 功能问题
【发布时间】:2018-03-05 12:57:09
【问题描述】:

有一个加号按钮可以增加页面中文本字段的数量。增加文本字段后,我想在单击提交按钮后一次显示所有文本字段输入值。 但是在这里它给 onChange setState 问题带来了问题。如何处理?有什么帮助吗?

这里是 => DEMO

class App extends Component {

constructor(props) {
    super(props);
    this.state = { 
      arr: [],
      firstname: '',
      lastname: '',
      setarr: [],
      temp: []
    };
    this.addTextfields = this.addTextfields.bind(this);
    this.changeFirstname = this.changeFirstname.bind(this);
    this.changeLastname = this.changeLastname.bind(this);
  }

  addTextfields(e) {
    let htmlContent = [];
    htmlContent.push(
      <div>
        <input type="text" placeholder="first name" onChange={this.changeFirstname} value={this.state.firstname} /> <br/> <br/>
        <input type="text" placeholder="last name" onChange={this.changeLastname} value={this.state.lastname} /> <br/> <br/>
      </div>
    );
    this.setState({ arr: this.state.arr.concat(htmlContent) });
  }

  changeFirstname(e) {
    this.setState({ firstname: e.target.value });
  }

  changeLastname(e) {
    this.setState({ lastname: e.target.value });
  }

  showTexts() {
    console.log(this.state.firstname, this.state.lastname);
    var add = [this.state.firstname, this.state.lastname];
    this.state.temp = this.state.temp.concat(add);
    this.setState({ setarr: this.state.temp, firstname: '', lastname: '' });
    // localStorage.setItem(this.state.arr, 'names');
  }

  render() {
    return (
      <div>
        <div className="App">
          <input type="text" onChange={this.changeFirstname} placeholder="first name" value={this.state.firstname} /> <br/> <br/>
          <input type="text" onChange={this.changeLastname} placeholder="last name" value={this.state.lastname} /> <br/> <br/>
          <button type="submit" onClick={this.addTextfields}>Plus</button>
          {this.state.arr}
        </div>
        <div className="submit-button">
          <button type="submit" onClick={this.showTexts.bind(this)}>Submit</button>
        </div>
        <div>
          {this.state.setarr}
        </div>
      </div>
    );
  }
}

render(<App />, document.getElementById('root'));

【问题讨论】:

  • 你能解释一下你想要达到的目标吗?我看到可以有多个输入,但它们都应该在状态中更改相同的字符串(名字,姓氏),这有点令人困惑。
  • 通过点击加号按钮增加输入字段,然后我只想在输入字段上输入内容并在点击提交按钮后显示提交按钮下的所有内容。
  • @Subhojit 是一个字段还是多个字段,您还想在其中接收名称还是可以是一些随机文本?另外,请告诉我们您计划如何接收这些字段中的数据?

标签: javascript reactjs onclick onchange


【解决方案1】:

这样做。

import React, { Component } from "react";
import { render } from "react-dom";

class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      arr: [
        {
          firstname: "",
          lastname: ""
        }
      ],
      displayValues: []
    };
    this.addTextfields = this.addTextfields.bind(this);
    this.changeFirstname = this.changeFirstname.bind(this);
    this.changeLastname = this.changeLastname.bind(this);
  }

  addTextfields(e) {
    let arr = this.state.arr;
    arr.push({
      firstname: "",
      lastname: ""
    });
    this.setState({ arr });
  }

  changeFirstname(e, index) {
    let arr = this.state.arr;
    arr[index].firstname = e.target.value;
    this.setState({ arr });
  }

  changeLastname(e, index) {
    let arr = this.state.arr;
    arr[index].lastname = e.target.value;
    this.setState({ arr });
  }

  showTexts() {
    let displayValues = [];
    this.state.arr.map(element => {
      console.log(element.firstname, element.lastname);
      var add = element.firstname + " " + element.lastname;
      displayValues.push(add);
    });
    this.setState({ displayValues });
  }

  render() {
    return (
      <div>
        <div className="App">
          {this.state.arr.map((element, index) => {
            return (
              <div key={index}>
                <input
                  type="text"
                  onChange={e => this.changeFirstname(e, index)}
                  placeholder="first name"
                  value={this.state.firstname}
                />{" "}
                <br /> <br />
                <input
                  type="text"
                  onChange={e => this.changeLastname(e, index)}
                  placeholder="last name"
                  value={this.state.lastname}
                />{" "}
                <br /> <br />
              </div>
            );
          })}
          <button type="submit" onClick={this.addTextfields}>
            Plus
          </button>
        </div>
        <div className="submit-button">
          <button type="submit" onClick={this.showTexts.bind(this)}>
            Submit
          </button>
        </div>
        <div>
          {this.state.displayValues.map(element => {
            return <p>{element}</p>;
          })}
        </div>
      </div>
    );
  }
}

render(<App />, document.getElementById("root"));

【讨论】:

    【解决方案2】:

    我想,你做错了。我创建了以下示例以供参考。请看一下。

    const Form = (props) => {
      return(
        <div>
            <input type="text" placeholder="first name" onChange={props.changeFirstname} value={props.firstname} /> <br/> <br/>
            <input type="text" placeholder="last name" onChange={props.changeLastname} value={props.lastname} /> <br/> <br/>
        </div>
      )
    }
    
    class App extends React.Component {
      constructor(props) {
        super(props);
        this.state = { 
          arr: [
            {
              firstname: '',
              lastname: '',
              id:1
            }
          ],
          showOutput:false
        };
        this.addTextfields = this.addTextfields.bind(this);
        this.changeFirstName = this.changeFirstName.bind(this);
        this.changeLastName = this.changeLastName.bind(this);
      }
    
      addTextfields(e) {
        debugger
        let oldArray = this.state.arr;
        this.setState((prevState) => { 
          return {
            arr: oldArray.concat({
              firstname: '',
              lastname: '',
              id: prevState.arr.length + 2
            })
          }
        });
      }
    
      changeFirstName(e, selectedIndex) {
        let updatedArray =  this.state.arr.map((data) => {
          if(data.id === selectedIndex) {
            return Object.assign({}, data, {
              firstname: e.target.value
            })
          } else {
            return data
          }
        })
    
        this.setState({ arr: updatedArray });
        
      }
    
      changeLastName(e, selectedIndex) {
        let updatedArray =  this.state.arr.map((data) => {
          if(data.id === selectedIndex) {
            return Object.assign({}, data, {
              lastname: e.target.value
            })
          } else {
            return data
          }
        })
        this.setState({ arr: updatedArray });
      }
    
      showTexts() {
        this.setState({
          showOutput: true
        })
      }
    
      render() {
        return (
          <div>
            <div className="App">
              {
                this.state.arr.map((data, index) => {
                  return <Form key={index} data={data} 
                          changeFirstname={(e) => this.changeFirstName(e, data.id)}
                          changeLastname={(e) => this.changeLastName(e, data.id)}
                        />
                })
              }
              <button type="submit" onClick={this.addTextfields}>Plus</button> 
            </div>
            <div className="submit-button">
              <button type="submit" onClick={this.showTexts.bind(this)}>Submit</button>
            </div>
            <div>
              {
                this.state.showOutput && 
                this.state.arr.map((data, index) => {
                  return <div>
                  {data.firstname}  {data.lastname}
                  </div>
                })
              }
            </div>
          </div>
        );
      }
    }
    
    ReactDOM.render(<App />, document.getElementById('root'));
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
    <div id="root"></div>

    希望这会有所帮助。

    【讨论】:

    • 非常感谢@Dev
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-11
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多