Поле ввода React Redux не позволяет мне печатать

Итак, у меня есть 3 поля ввода, одно для имени, электронной почты и пароля. Поле ввода электронной почты и пароля работает нормально, но поле ввода имени не позволяет мне ничего вводить. У меня есть значения для полей ввода, заданные пользователем, поэтому он автоматически заполняет поля. Вот мой код


    import React, {useState, useEffect} from 'react';
    import {useParams} from 'react-router-dom';
    import {connect} from 'react-redux';
    import {editUserData, fetchUserData, deleteProfile} from '../actions/index';

    const EditUser = props => {
        const [user, setUser] = useState({name: '', email: '', password: ''})
        const params = useParams();
        
        const editUser = e => {
            e.preventDefault();
            props.editUserData(params, user);
        }

        const handleChanges = e => {
            e.persist();
            setUser({...user, [e.target.name]: e.target.value});
        }

        useEffect(() => {
            props.fetchUserData(params, setUser);
        }, [])

        const deleteOnClick = () => {
            props.deleteProfile(params)
        }
        
            return (
                <>
                <form className='editUserForm' onSubmit={editUser}>
                    <h3>Edit Profile !</h3>
                    <div>Name</div>
                    <input className='editInput' type='text' name='name' value={`${user.firstName} ${user.lastName}`} onChange={handleChanges} /> 
                    <div>Email</div>
                    <input className='editInput' type='text' name='email' value={user.email} onChange={handleChanges} />
                    <div>Password</div>
                    <input className='editInput' type='text' name='password' value={user.password} onChange={handleChanges} />
                    <button className='submitButton'>Submit</button>
                </form>
                <div className='deleteProfile'>
                    <button className='deleteProfileButton' onClick={deleteOnClick}>Delete Profile</button>
                </div>
                </>
            )
    }

    const mapStateToProps = state => {
        return {
            users: [], 
            user: {}, 
            registerSuccessMessage: '',
            user_stories: {}, 
            isLoading: false, 
            error: null 
        }
    }

    export default connect(mapStateToProps, {editUserData, fetchUserData, deleteProfile})(EditUser);

Изменить (по предложению @Boussadjra)

введите здесь описание изображения

Вот как выглядит состояние после props.fetchUserData. -- где setUser -- Вот почему у меня есть входные значения для ${user.firstName} ${user.lastName}


person nKc    schedule 28.08.2020    source источник
comment
у вас есть какие-то ошибки в консоли?   -  person Boussadjra Brahim    schedule 29.08.2020
comment
Значение поля имени статически установлено как имя + фамилия, но эти переменные не затрагиваются обратным вызовом onChange.   -  person numbers1311407    schedule 29.08.2020
comment
ошибок в консоли нет. Должен ли я просто сделать отдельный onChange для поля имени, может быть? @numbers1311407 Спасибо за помощь   -  person nKc    schedule 29.08.2020
comment
Это зависит от того, что вы пытаетесь сделать. Имя и фамилия в одном поле всегда подвержены ошибкам (что, если они младшие или набирают свой средний инициал). Я не знаю ваших требований, но я бы, вероятно, оставил его как одно поле имени (и, возможно, попытался разобрать имя позже) или разбил его на несколько полей.   -  person numbers1311407    schedule 29.08.2020
comment
Да, я могу просто сделать поле имени и фамилии отдельно. В очередной раз благодарим за помощь   -  person nKc    schedule 29.08.2020


Ответы (2)


Это потому, что вы устанавливаете имя input value на ${user.firstName} ${user.lastName}, то есть undefined. Вы можете настроить состояние user так, чтобы оно изначально имело эти свойства, но я бы предложил использовать отдельные useState() для каждого из firstName, lastName, email и password (поскольку объединение имени и фамилии в одном input чревато ошибками, как упоминалось в Комментарии):

import React, {useState, useEffect} from 'react';
import {useParams} from 'react-router-dom';
import {connect} from 'react-redux';
import {editUserData, fetchUserData, deleteProfile} from '../actions/index';

const EditUser = props => {
    const [firstName, setFirstName] = useState('');
    const [lastName, setLastName] = useState('');
    const [email, setEmail] = useState('');
    const [password, setPassword] = useState('');
    const params = useParams();
    
    const editUser = e => {
        e.preventDefault();
        props.editUserData(params, user);
    }

    useEffect(() => {
        props.fetchUserData(params, setUser);
    }, [])

    const deleteOnClick = () => {
        props.deleteProfile(params)
    }
    
        return (
            <>
            <form className='editUserForm' onSubmit={editUser}>
                <h3>Edit Profile !</h3>
                <div>First Name</div>
                <input className='editInput' type='text' name='firstName' value={firstName} onChange={e => setFirstName(e.target.value)} />
                <div>Last Name</div>
                <input className='editInput' type='text' name='lastName' value={lastName} onChange={e => setLastName(e.target.value)} /> 
                <div>Email</div>
                <input className='editInput' type='text' name='email' value={email} onChange={e => setEmail(e.target.value)} />
                <div>Password</div>
                <input className='editInput' type='text' name='password' value={password} onChange={e => setPassword(e.target.value)} />
                <button className='submitButton'>Submit</button>
            </form>
            <div className='deleteProfile'>
                <button className='deleteProfileButton' onClick={deleteOnClick}>Delete Profile</button>
            </div>
            </>
        )
}

const mapStateToProps = state => {
    return {
        users: [], 
        user: {}, 
        registerSuccessMessage: '',
        user_stories: {}, 
        isLoading: false, 
        error: null 
    }
}

export default connect(mapStateToProps, {editUserData, fetchUserData, deleteProfile})(EditUser);

person Ryan    schedule 28.08.2020

user.firstName и user.lastName не определены, они не определены как свойства в вашем состоянии user, поэтому вы должны просто использовать свойства firstName и lastName в качестве значения:

 value={ us}

или определите свое состояние следующим образом:

 const [user, setUser] = useState({firstName:'',lastName:'', email: '', password: ''})

мы предполагаем, что имя и фамилия разделены пробелом, поэтому, когда вы придете к обновлению состояния, разделите это имя:

  const handleChanges = e => {
        e.persist();
       if(e.target.name==='name'){
           let name=e.target.value.split(' ')
           setUser({...user, firstName:name[0],lastName:name[1]});
        }else{
        setUser({...user, [e.target.name]: e.target.value});
        }
    }

person Boussadjra Brahim    schedule 28.08.2020
comment
Я вижу что ты тут делал. К сожалению, он просто копирует значение или имя/фамилия и добавляет в конец a. Я выложу фото в конце поста, чтобы вы понимали, о чем я - person nKc; 29.08.2020
comment
Ах, я забыл изменить значение. Однако, когда я меняю значение, автозаполнение сбивается. (У меня есть пользователь, получающий свои данные из props.fetchUserData -- действие с редукцией --. Вот почему у меня установлено значение ${user.firstName} ${user.lastName} - person nKc; 29.08.2020
comment
Я загрузил изображение следующего состояния, полученного из fetchUserData, чтобы лучше объяснить себя в последнем комментарии. - person nKc; 29.08.2020
comment
я думаю, что мы должны получить схему объекта из реквизита, я обновлю свой ответ - person Boussadjra Brahim; 29.08.2020
comment
Теперь он делает то же самое, что и раньше (реплицирует имя и просто добавляет a в конец). Я думаю, что лучше всего сделать два отдельных поля ввода для имени и фамилии. - person nKc; 29.08.2020
comment
когда именно у вас такое поведение? первый рендеринг или после ввода чего-то? - person Boussadjra Brahim; 29.08.2020
comment
Как только я наберу a, новое имя станет Нико Тикудзя Чикудзя, а не просто Нико Тикудзя. - person nKc; 29.08.2020