代码之家  ›  专栏  ›  技术社区  ›  one-hand-octopus

在React中输入值改变时如何保持初始状态?

  •  1
  • one-hand-octopus  · 技术社区  · 4 年前

    我有下面的代码,只想更新输入字段上的文本值。

    import React, { useState } from 'react';
    const Form = () => {
        const initialState = {
            name: 'John',
            age: 25
        };
        const [{ name, age }, setFormState] = useState(initialState);
    
        const handleNameChange = (e) => {
            setFormState({
                name: e.target.value
            });
        };
    
        const handleAgeChange = (e) => {
            setFormState({
                age: e.target.value
            })
        };
        
        return (
            <>
                <form onSubmit={(e) => e.preventDefault()}>
                    <label htmlFor='name'>Name: </label>
                    <input type='text' id='name' name='name' placeholder={name} onChange={handleNameChange} />
                    <p>The person's name is {name}.</p>
                    <br />
                    <label htmlFor='age'>Age: </label>
                    <input type='text' id='age' name='age' placeholder={age} onChange={handleAgeChange} />
                    <p>His/her age is {age}.</p>
                </form>
            </>
        )
    }
    
    export default Form;

    https://codesandbox.io/s/react-playground-forked-tskj9?file=/Form.js

    问题是,在name字段中输入值时,age字段被清除,反之亦然。我知道这可能是因为 initialState 在字段中更改后不再有效,但如何在其中保留值 <input> <p> 当输入另一个?

    2 回复  |  直到 4 年前
        1
  •  1
  •   CertainPerformance    4 年前

    而你可以通过把另一个属性包含在 setFormState 例如:

    setFormState({
        name: e.target.value
        age,
    });
    

    const Form = () => {
        const [name, setName] = React.useState('John');
        const [age, setAge] = React.useState(25);
    
        const handleNameChange = (e) => {
            setName(e.target.value);
        };
    
        const handleAgeChange = (e) => {
            setAge(e.target.value);
        };
        
        return (
            <form onSubmit={(e) => e.preventDefault()}>
                <label htmlFor='name'>Name: </label>
                <input type='text' id='name' name='name' placeholder={name} onChange={handleNameChange} />
                <p>The person's name is {name}.</p>
                <br />
                <label htmlFor='age'>Age: </label>
                <input type='text' id='age' name='age' placeholder={age} onChange={handleAgeChange} />
                <p>His/her age is {age}.</p>
            </form>
        )
    }
    ReactDOM.render(<Form />, document.querySelector('.react'));
    <script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
    <script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
    <div class="react"></div>
        2
  •  1
  •   kind user Faly    4 年前

    useState 钩子属性不会像以前那样合并在一起 setState 类组件中的函数。您必须包含缺少的字段,才能将它们保留在对象中。

    setFormState({
       name: e.target.value,
       age,
    });