【问题标题】:React redux -- input field not letting me typeReact redux - 输入字段不允许我输入
【发布时间】:2020-08-28 23:07:37
【问题描述】:

所以我有 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}

输入值的原因

【问题讨论】:

  • 控制台有错误吗?
  • name 字段的值静态设置为 first + last name,但这些变量不受 onChange 回调的影响。
  • 控制台中没有错误。我应该为名称字段单独创建一个 onChange 吗? @numbers1311407 感谢您的帮助
  • 这取决于你想要做什么。一个字段中的名字和姓氏总是容易出错的设计(如果他们是“初级”或输入他们中间的首字母怎么办)。我不知道您的要求,但我可能会将其保留为一个“名称”字段(并可能稍后尝试解析名称)或将其拆分为多个字段。
  • 是的,我可以单独创建一个名字和姓氏字段。再次感谢您的帮助

标签: javascript reactjs redux input-field


【解决方案1】:

这是因为您将“名称”inputvalue 设置为${user.firstName} ${user.lastName},即undefined。您可以将user 状态设置为最初具有这些属性,但我建议为firstNamelastNameemailpassword 中的每一个使用单独的useState()(因为结合了第一个和最后一个如 cmets 中所述,单个 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);

【讨论】:

    【解决方案2】:

    user.firstNameuser.lastName 未定义,它们未定义为 user 状态中的属性,因此您应该简单地使用 firstNamelastName 属性作为值:

     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});
            }
        }
    
    

    【讨论】:

    • 我知道你在那里做了什么。不幸的是,它只是复制值或 firstName/lastName 并在末尾添加一个 a。我会在帖子末尾贴一张照片,让你明白我的意思
    • 啊,我忘记更改值了。但是,当我更改值时,自动填充会混乱。 (我让用户从 props.fetchUserData 获取其数据——一个 redux 操作——这就是为什么我将值设置为 ${user.firstName} ${user.lastName}
    • 我上传了一张来自 fetchUserData 的下一个状态的图片,以便在上一条评论中更好地解释自己。
    • 我认为我们应该来自道具的对象模式,我会更新我的答案
    • 它现在做的事情和以前一样(复制名称并在末尾添加一个 a)。我认为最好为名字和姓氏创建两个单独的输入字段
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-30
    • 1970-01-01
    • 1970-01-01
    • 2014-09-14
    • 2018-03-06
    • 2023-03-12
    • 2021-07-12
    相关资源
    最近更新 更多