使用单个事件处理程序更改多个文本框值

Using single event handler for changing multiple text box values

home.jsx 文件

import React, { Component } from 'react';
// import 'react-dropdown/style.css';
import { Select, Input, Button } from 'antd';
import App from './App';


const { Option } = Select;
const INITIAL_STATE = {
    isShowResult: false,

    allData: {
        languages: [
            '/assets/tech logos/Languages/Javascript/angular js.png',
        ],

        frameWorks: [
            '/assets/tech logos/IDE/Eclipse.png',
        ],

        buildSystem: [
            '/assets/tech logos/Build servers/apache ant.png',
        ],

        bugTracking: [
            '/assets/tech logos/Bugtracking/bugzilla.png',
        ],

        textBox1: ' ',

        textBox2: ' ',

        textBox3: ' ',

        textBox4: ' ',
    },
};

export default class Home extends Component {
    constructor(props) {
        super(props);
        this.state = INITIAL_STATE;

        this.handleChangeLanguages = this.handleChangeLanguages.bind(this);
        this.handleChangeFrameworks = this.handleChangeFrameworks.bind(this);
        this.handleChangeBuildSystem = this.handleChangeBuildSystem.bind(this);
        this.handleChangeBugTracking = this.handleChangeBugTracking.bind(this);
        this.handleChangeTextBox = this.handleChangeTextBox.bind(this);
        this.handleChangeTextBox1 = this.handleChangeTextBox1.bind(this);
        this.handleChangeTextBox2 = this.handleChangeTextBox2.bind(this);
        this.handleChangeTextBox3 = this.handleChangeTextBox3.bind(this);
        this.handleSubmit = this.handleSubmit.bind(this);
    }

    handleChangeLanguages(languages) {
        this.setState({ languages });
    }

    handleChangeFrameworks(frameWorks) {
        this.setState({ frameWorks });
    }

    handleChangeBuildSystem(buildSystem) {
        this.setState({ buildSystem });
    }

    handleChangeBugTracking(bugTracking) {
        this.setState({ bugTracking });
    }

    handleChangeTextBox(e1) {
        this.setState(prevState => ({
            allData: {
                ...prevState.allData,
                textBox1: this.allData,
            },
        }));
        console.log(e1.target.value);
    }

    //  1st example

    // this.setState({
    //   e1: this.allData.text.value
    //   },()=> {
    //   console.log('Output: ' + this.state.content)
    //   })

    //  2nd example

    // this.setState(prevState => ({
    //   ...prevState,
    //   dragList: {
    //         ...prevState.dragList,
    //         [res]: {
    //               ...prevState.dragList[res],
    //               [type]: {
    //                     ...prevState.dragList[res][type],
    //                     ...result
    //               }
    //         }
    //   }
    // }))

    //  3rd example

    // ...this.state,
    //         textArea: {
    //           ...this.state.textArea,
    //           foo: foo,
    //         },
    //       }, ()=>console.log(this.state.textArea.foo)); //'some foo'
    //     }

    handleChangeTextBox1(e) {
        this.setState({
            allData: { ...this.prevState, ...this.e },
            ...this.textBox2 = e.target.value,
        });

        console.log(e.target.value);
    }

    handleChangeTextBox2(e) {
        this.setState({ allData: { textBox3: e.target.value } });
        console.log(e.target.value);
    }

    handleChangeTextBox3(e) {
        this.setState({ allData: { textBox4: e.target.value } });
        console.log(e.target.value);
    }

    handleSubmit(event) {
        // event.preventDefault();
        this.setState({ isShowResult: true });
    }


    render() {
        const { isShowResult, allData } = this.state;
        const {
            textBox1, textBox2, textBox3, textBox4,
        } = allData;
        return (
            <div>
                <div>
                    {!isShowResult &&
                        <form onSubmit={this.handleSubmit} style={{ padding: 30 }}>

                            { /* first dropdown */}

                            <div>
                                <b> <h3 > What language you like ? </h3> </b >

                            </div>
                            <Select mode="multiple" defaultValue="/assets/tech logos/Languages/Javascript/angular js.png" className="selectdiv" onChange={this.handleChangeLanguages}>
                                <Option value="/assets/tech logos/Languages/Javascript/angular js.png">
                                    <img src="/assets/tech logos/Languages/Javascript/angular js.png" alt="angular" className="image-size-slider" />
                                </Option>

                                <Option value="/assets/tech logos/Languages/JAVA/java-logo.jpg">
                                    <img src="/assets/tech logos/Languages/JAVA/java-logo.jpg" alt="java" className="image-size-slider" />
                                </Option>

                                <Option value="/assets/tech logos/Languages/Javascript/react js.png">
                                    <img src="/assets/tech logos/Languages/Javascript/react js.png" alt="reactjs" className="image-size-slider" />
                                </Option>

                                <Option value="/assets/tech logos/Languages/Javascript/node js.png">
                                    <img src="/assets/tech logos/Languages/Javascript/node js.png" alt="nodejs" className="image-size-slider" />
                                </Option>

                                <Option value="/assets/tech logos/Languages/Microsoft/AspDotNet.png">
                                    <img src="/assets/tech logos/Languages/Microsoft/AspDotNet.png" alt=".net" className="image-size-slider" />
                                </Option>

                                <Option value="/assets/tech logos/Languages/Python/Python.png">
                                    <img src="/assets/tech logos/Languages/Python/Python.png" alt="python" className="image-size-slider" />
                                </Option>

                                <Option value="/assets/tech logos/Languages/C++.png">
                                    <img src="/assets/tech logos/Languages/C++.png" alt="c++" className="image-size-slider" />
                                </Option>

                            </Select>

                            { /* second dropdown */}

                            <div >
                                <b > <h3 > Which STACK / IDE you like ? </h3></b >
                            </div>

                            <Select mode="multiple" defaultValue="/assets/tech logos/IDE/Eclipse.png" className="selectdiv" onChange={this.handleChangeFrameworks}>

                                <Option value="/assets/tech logos/IDE/Eclipse.png">
                                    <img src="/assets/tech logos/IDE/Eclipse.png" alt="eclipse" className="image-size-slider" />
                                </Option>

                                <Option value="/assets/tech logos/IDE/IntelliJ_IDEA_Logo.svg.png">
                                    <img src="/assets/tech logos/IDE/IntelliJ_IDEA_Logo.svg.png" alt="intellij" className="image-size-slider" />
                                </Option>
                                <Option value="/assets/tech logos/IDE/visual_studio_purple (1).png">
                                    <img src="/assets/tech logos/IDE/visual_studio_purple (1).png" alt="angular" className="image-size-slider" />
                                </Option>
                            </Select>

                            {/* third dropdown */}

                            <div>
                                <b> <h3>  Which Build Servers you like ? </h3> </b>
                            </div>
                            <Select mode="multiple" defaultValue="/assets/tech logos/Build servers/apache ant.png" style={{ padding: 10 }} onChange={this.handleChangeBuildSystem} >
                                <Option value="/assets/tech logos/Build servers/apache ant.png">
                                    <img src="/assets/tech logos/Build servers/apache ant.png" alt="apache" className="image-size-slider" />
                                </Option>
                                <Option value="/assets/tech logos/Build servers/bamboo-darkbluetext_medium_trans.png">
                                    <img src="/assets/tech logos/Build servers/bamboo-darkbluetext_medium_trans.png" alt="bamboo" className="image-size-slider" />
                                </Option>
                                <Option value="/assets/tech logos/Build servers/gitlab.png">
                                    <img src="/assets/tech logos/Build servers/gitlab.png" alt="gitlab" className="image-size-slider" />
                                </Option>
                                <Option value="assets/tech logos/Build servers/maven.png">
                                    <img src="/assets/tech logos/Build servers/maven.png" alt="maven" className="image-size-slider" />
                                </Option>
                                <Option value="/assets/tech logos/Build servers/vsts-2015.png">
                                    <img src="/assets/tech logos/Build servers/vsts-2015.png" alt="vsts" className="image-size-slider" />
                                </Option>

                            </Select>

                            {/* fourth dropdown */}

                            <div>
                                <b> <h3>  Which Bug Tracking Software you like ? </h3> </b>
                            </div>
                            <Select mode="multiple" defaultValue="/assets/tech logos/Bugtracking/bugzilla.png" style={{ padding: 10 }} onChange={this.handleChangeBugTracking} >
                                <Option value="/assets/tech logos/Bugtracking/bugzilla.png">
                                    <img src="/assets/tech logos/Bugtracking/bugzilla.png" alt="bugzilla" className="image-size-slider" />
                                </Option>
                                <Option value="/assets/tech logos/Bugtracking/jira.png">
                                    <img src="/assets/tech logos/Bugtracking/jira.png" alt="jira" className="image-size-slider" />
                                </Option>
                                <Option value="/assets/tech logos/Bugtracking/Micro focus ALM.jpeg">
                                    <img src="/assets/tech logos/Bugtracking/Micro focus ALM.jpeg" alt="focusAlm" className="image-size-slider" />
                                </Option>
                            </Select>
                            <div className="textarea example-input" >
                                <div>
                                    <b>
                                        <h3>
                                            Show me your interest.
                    </h3>
                                    </b>
                                    <Input size="large" value={textBox1} onChange={this.handleChangeTextBox} />
                                </div>
                                <div>
                                    <b>
                                        <h3>
                                            Show me your interest.
                    </h3>
                                    </b>
                                    <Input size="large" value={textBox2} onChange={this.handleChangeTextBox1} />
                                </div>
                                <div>
                                    <b>
                                        <h3>
                                            Show me your interest.
                    </h3>
                                    </b>
                                    <Input size="large" value={textBox3} onChange={this.handleChangeTextBox2} />
                                </div>
                                <div>
                                    <b>
                                        <h3>
                                            Show me your interest.
                    </h3>
                                    </b>
                                    <Input size="large" value={textBox4} onChange={this.handleChangeTextBox3} />
                                </div>
                            </div>
                            <div>
                                <Button type="danger" className="button" onClick={this.handleSubmit} >Click Here</Button>
                            </div>

                        </form>
                    }

                </div>

                <div>

                    {isShowResult &&
                        <div>
                            <App data={allData} />
                        </div>
                    }
                </div>
            </div>
        );
    }
}

app.js 文件

import React from 'react';
import { Row, Col } from 'antd';
export const languages = [

    '/assets/tech logos/Languages/Javascript/angular js.png',
    '/assets/tech logos/Languages/JAVA/java-logo.jpg',
    '/assets/tech logos/Languages/Javascript/react js.png',
    '/assets/tech logos/Languages/Javascript/node js.png',
    '/assets/tech logos/Languages/Microsoft/AspDotNet.png',
    '/assets/tech logos/Languages/Python/Python.png',
    '/assets/tech logos/Languages/C++.png',

];

export const frameWorks = [
    '/assets/tech logos/IDE/Eclipse.png',
    '/assets/tech logos/IDE/IntelliJ_IDEA_Logo.svg.png',
    '/assets/tech logos/IDE/visual_studio_purple (1).png',
];

export const buildSystem = [
    '/assets/tech logos/Build servers/apache ant.png',
    '/assets/tech logos/Build servers/bamboo-darkbluetext_medium_trans.png',
    '/assets/tech logos/Build servers/gitlab.png',
    '/assets/tech logos/Build servers/maven.png',
    '/assets/tech logos/Build servers/vsts-2015.png',
];

export const bugTracking = [
    '/assets/tech logos/Bugtracking/bugzilla.png',
    '/assets/tech logos/Bugtracking/jira.png',
    '/assets/tech logos/Bugtracking/Micro focus ALM.jpeg',
];

export default function APP(props) {

    const languagesmap = props.data.map(languages => <img src={languages} alt={languages} className="image-size" />);
    const frameWorksmap = props.data1.map(frameWorks => <img src={frameWorks} alt={frameWorks} className="image-size" />);
    const buildSystemmap = props.data2.map(buildSystem => <img src={buildSystem} alt={buildSystem} className="image-size" />);
    const bugTrackingmap = props.data3.map(bugTracking => <img src={bugTracking} alt={bugTracking} className="image-size" />);

    return (
        <div>
            <center>
                <h1> <div className="text-color"> <b>MS SOFTWARE</b> </div> </h1>
                {/* <b>you selecte {props.data} </b> */}

            </center>
            <div className="gutter-example">

                <Row type="flex" justify="center" gutter={0}>

                    <Col className="gutter-row " span={4}>
                        <div className="gutter-box border-right-upper">
                            <div>
                                <Row>

                                    <Col className="text" span={24}>
                                        <center>  <b> Tech Stack </b> </center>
                                    </Col>

                                </Row>

                                <Row>

                                    <Col span={24}>
                                        {/* <img src={languagesmap} alt={languagesmap} className="image-size"/> */}
                                        {languagesmap}
                                    </Col>

                                </Row>
                            </div>

                        </div>
                    </Col>

                    <Col className="gutter-row " span={4}>
                        <div className="gutter-box border-right-upper">
                            <div>
                                <Row>

                                    <Col className="text" span={24}>

                                        <center>  <b> IDE/STACK </b> </center>

                                    </Col>

                                </Row>

                                <Row>

                                    <Col span={24}>
                                        {/* <img src={props.data1} alt={props.data1} className="image-size"/> */}
                                        {frameWorksmap}
                                    </Col>

                                </Row>

                            </div>

                        </div>
                    </Col>

                    <Col className="gutter-row" span={4}>
                        <div className="gutter-box border-right-upper">
                            <div>
                                <Row>

                                    <Col className="text" span={24}>

                                        <center>  <b> Build System </b> </center>
                                    </Col>

                                </Row>

                                <Row>
                                    <Col span={24}>
                                        {/* <img src={props.data2} alt={props.data2} className="image-size"/> */}
                                        {buildSystemmap}
                                    </Col>

                                </Row>
                            </div>
                        </div>
                    </Col>

                    <Col className="gutter-row" span={4}>
                        <div className="gutter-box border">
                            <div>
                                <Row>

                                    <Col className="text" span={24}>
                                        <center>  <b> Bug Tracking </b> </center>
                                    </Col>

                                </Row>

                                <Row>

                                    <Col span={24}>
                                        {/* <img src={props.data3} alt={props.data3} className="image-size"/> */}
                                        {bugTrackingmap}
                                    </Col>

                                </Row>
                            </div>
                        </div>
                    </Col>

                </Row>

                <Row type="flex" justify="center" gutter={0}>

                    <Col className="gutter-row " span={4}>
                        <div className="gutter-box border-right-lower">
                            <Col span={4} />
                            <Col span={16}>
                                <b>
                                    {props.textData1}
                                </b>
                            </Col>
                            <Col span={4} />
                        </div>
                    </Col>

                    <Col className="gutter-row " span={4}>
                        <div className="gutter-box border-right-lower">
                            <Col span={3} />
                            <Col span={18}>
                                <b>
                                    {props.textData2}
                                </b>
                            </Col>
                            <Col span={3} />
                        </div>
                    </Col>

                    <Col className="gutter-row " span={4}>
                        <div className="gutter-box border-right-lower">
                            <Col span={4} />
                            <Col span={16}>
                                <b> {props.textData3} </b>
                            </Col>
                            <Col span={4} />
                        </div>
                    </Col>

                    <Col className="gutter-row " span={4}>
                        <div className="gutter-box">
                            <Col span={4} />
                            <Col span={16}>
                                <b> {props.textData4} </b>
                            </Col>
                            <Col span={4} />
                        </div>
                    </Col>

                </Row>

            </div>
        </div >
    );
}

如果我必须在 setState 函数中使用对象和展开运算符,应该怎么办:

handleChangeTextBox1(e){ 
      this.setState({
            allData:(this.state.textBox,{textBox:e.target.value} )
       }); 
 console.log(e.target.value) }

这里,allData 是一个有对象textBox 的函数。 textBox是数据输入的输入区。我使用不同的句柄更改事件和 this.setState 的不同值完成了这个示例。如何在一个 setState 中使用它?

我试过的旧版本代码是这样的:

handleChangeTextBox(e){ this.setState({allData:{textBox: e.target.value}}); console.log(e.target.value) }

但是这里一个文本框中的数据更改会更改所有句柄更改事件的数据。

尝试这样的事情

handleChangeTextBox1(e){ 
      this.setState((prevState)=>{
            return {allData:{...prevState.allData, {textBox:e.target.value}}}
       }); 
 console.log(e.target.value) 
}

您需要识别从状态到数据的文本映射,为此您可以存储与 textBox

的 ID 映射的值
state = {
   allData: {}
}

handleChangeTextBox(e){
    this.setState(prevState => ({
        allData:{
          ...prevState.allData,
          [e.target.name]: e.target.value
        }
     })); 
}

在此之后,您可以像这样设置文本框值

<input name="inp1" value={this.state.allData["inp1"]} onChange={this.handleChangeTextBox}/>

谢谢你宝贵的时间,但经过这么多时间我得到了方法..

`  handleChangeTextBox(e) {
    this.setState((prevState) => ({
      allData: {
        ...prevState.allData,
        textBox: e.target.value,
      }
    }));
    e.persist();
  }`

我在这里使用了 event.persist() 方法,该方法将数据保持在异步模式中,并用于数据持久化,如名称所示,您可以在这里阅读。 Event Persist in react

谢谢你..;-)