javascript - 在 ReactJS 中将数据从表单发送到父组件

标签 javascript forms reactjs

我有这个 AddUser 组件,它是一个简单的组件,它获取电子邮件地址和下拉列表中的 Angular 色,然后将这两个值传递给父组件。除一件事外一切正常:如果我先输入电子邮件地址然后选择 Angular 色,它 onChange() 不会从下拉列表中获取值并将 null 传递给父组件。但是,如果我先选择 Angular 色,然后输入电子邮件,onChange() 会获得这两个值!我该如何解决?

这个组件有 3 个属性:roles 是一个字典,我正在从它创建 rolesList 以将其用作 DropdownList 的数据(它来自 react-widget, https://jquense.github.io/react-widgets/docs/#/?_k=3fo3eq )。第二个 Prop 是 handleChange(),它设置父组件的状态。第 3 个是 handleAddNewUser(),它将值从表单返回到父组件。

export const AddUser = React.createClass({
    getInitialState() {
        return {
            email: "",
            selectedRole: "",
        };
    },

    onChange() {
        var email = this.email.value;
        this.props.handleChange(email, this.state.selectedRole); 
    }, 

    render() {
        var rolesList = [];
        for(var key in this.props.roles){
            rolesList.push(key);
        }
        return(
            <div >
                <form onSubmit={this.props.handleAddNewUser}>
                    <label >New user email address:</label>
                    <input ref={(ref) => this.email = ref} name='email'  type='email' onChange={this.onChange}  required />
                    <label >Choose a role for new user:</label>
                    <DropdownList data={rolesList} value={this.state.selectedRole} name='rolesList' onChange={selectedRole => this.setState({ selectedRole })} /> 
                    <button type="submit" >Add user</button>
                </form>
            </div>
        );
    },
});

更新:这是来自父组件的代码,handleChange() 设置父组件的状态。 handleAddNewUser() 应该使用状态并发出 ajax 请求来创建新用户。现在它获取 newUserEmail 的值,但不是 newUserRole

handleChange(email, selectedRole){
    this.setState({newUserEmail: email})
    this.setState({newUserRole: selectedRole})
},

handleAddNewUser(e) {
    e.preventDefault();
    // using its state, it supposed to make an ajax request and create a new user
    }

最佳答案

如果需要,您可以从提交处理程序中获取值。 Here is an example .

编辑:DropdownList 组件不会创建一个真正的select 表单元素,它只是创建一堆div 元素。这就是为什么普通的 event.target 解决方案不起作用的原因。您确实需要组件的自定义 onChange 处理程序。试试下面的。它只会在本地设置状态,但这应该足以将此数据发送到任何父容器。您尚未发布 this.props.handleChange 的代码,因此无法知道它可以采用哪些参数。

Edit2:添加提交处理程序以使用正确的数据调用“this.props.handleChange”。

export const AddUser = React.createClass({
       getInitialState() {
           return {
               email: "",
               selectedRole: "",
           };
       },

       onChange(e) {
         this.setState({
           [e.target.name]: e.target.value
         })
       },

       onSubmit(e) {
         e.preventDefault();
         this.props.handleChange(this.state.email, this.state.selectedRole)
       },

       render() {
           var rolesList = [];
           for(var key in this.props.roles){
               rolesList.push(key);
           }
           return(
               <div >
                   <form onSubmit={this.onSubmit}>
                       <label >New user email address:</label>
                       <input ref={(ref) => this.email = ref} name='email'  type='email' onChange={this.onChange}  required />
                       <label >Choose a role for new user:</label>
                       <DropdownList ref={(ref) => this.role = ref} data={rolesList} value={this.state.selectedRole} name='rolesList' onChange={selectedRole => this.setState({ selectedRole })} /> 
                       <button type="submit" >Add user</button>
                   </form>
               </div>
           );
       },
   });

请注意 this.setState({ [e.target.name]: e.target.value }) 像这样使用方括号是一种在不知道前面的名称的情况下设置对象键的方法的时间。在这种情况下,无论元素的名称 prop 是什么(电子邮件)。

关于javascript - 在 ReactJS 中将数据从表单发送到父组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42713947/

相关文章:

javascript - Django 无法在设置中导入 ckeditor 但可以在 shell 中导入?

javascript - 使用 AjaxChosen 的事件处理程序

javascript - 使用 onclick 和 onsubmit 提交表单

php - 从 for 循环创建 PHP 下拉菜单?

reactjs - Onclick 按钮 我想在 ReactJS 中渲染多个组件?

html - 前景文本具有与背景相同的过滤器

html - 从页面导航和返回页面时 CSS 更改 - React

javascript - React Native 中的 Firebase 可调用函数

javascript - 指令在引导网格中工作很奇怪

javascript - 在 JavaScript 中简单替换为用户输入