J33*_*3nn 43 reactjs redux redux-form react-redux
我正在尝试使用API中的数据填充配置文件表单.不幸的是,在这种情况下,redux-form不想与我合作.出于某种原因,无论我做什么,田地都会空着
由于某种原因,设置固定值而不是从reducer传递的值很好.
也许这是因为我在动作创建者中使用redux-promise进行API调用?我怎么能忍受它并摆脱它.这是我的表单组件.
import React, { Component } from 'react';
import { reduxForm, Field } from 'redux-form';
import { connect } from 'react-redux';
import { fetchRoleList, fetchUserData } from '../actions';
class UserEdit extends Component {
    componentWillMount() {
        this.props.fetchRoleList();
        this.props.fetchUserData();
    }
    handleEditProfileFormSubmit(formProps) {
        console.log(formProps);
    }
    getRoleOptions(selected_id) {
        if (!this.props.profile) {
            return <option>No data</option>;
        }
        return this.props.profile.roles.map(role => {
            return <option key={role.role_id} value={role.role_id}>{role.name}</option>;
        });
    }
    renderField(props) {
        const { input, placeholder, label, value, type, meta: { touched, error } } = props;
        return (
        <fieldset className={`form-group ${ (touched && error) ? 'has-error' : '' }`}>
            <label>{label}</label>
            <input className="form-control" {...input} type={type} placeholder={placeholder} />
            {touched && error && <div className="error">{error}</div>}
        </fieldset>
        );
    }
    renderSelect({ input, placeholder, options, label, type, meta: { touched, error } }) {
        return (
        <fieldset className={`form-group ${ (touched && error) ? 'has-error' : '' }`}>
            <label>{label}</label>
            <select className="form-control" {...input}>
                {options}
            </select>
            {touched && error && <div className="error">{error}</div>}
        </fieldset>
        );
    }
    render() {
        const { handleSubmit } = this.props;
        const user = this.props.profile.user;
        return (
        <div> {user ? user.email : ''}
            <form onSubmit={handleSubmit(this.handleEditProfileFormSubmit.bind(this))}>
                <Field name="email" label="Email:" component={this.renderField} type="text" placeholder="email@gmail.com" className="form-control"/>
                <Field name="name" label="Name:"  component={this.renderField} type="text" placeholder="John Doe" className="form-control"/>
                <Field name="role" label="Role:" component={this.renderSelect} type="select" className="form-control" options={this.getRoleOptions()}/>
                <button action="submit" className="btn btn-primary">Edit user</button>
                <Field name="password" label="Password:" component={this.renderField} type="password" className="form-control"/>
                <Field name="passwordConfirm" label="Confirm Password:" component={this.renderField} type="password" className="form-control"/>
                { this.props.errorMessage
                &&  <div className="alert alert-danger">
                        <strong>Oops!</strong> {this.props.errorMessage}
                    </div> }
                <button action="submit" className="btn btn-primary">Sign up!</button>
            </form>
        </div>
        );
    }
}
let InitializeFromStateForm = reduxForm({
    form: 'initializeFromState'
})(UserEdit);
InitializeFromStateForm = connect(
  state => ({
    profile: state.profile,
    initialValues: state.profile.user
  }),
  { fetchRoleList, fetchUserData }
)(InitializeFromStateForm);
export default InitializeFromStateForm;
Run Code Online (Sandbox Code Playgroud)
我相信动作创作者也会很有用:
export function fetchUserData(user_id) {
    user_id = user_id ? user_id : '';
    const authorization = localStorage.getItem('token');
    const request = axios.get(`${ROOT_URL}/user/${user_id}`, {
      headers: { authorization }
    });
    return {
        type: FETCH_USER,
        payload: request
    };
}
Run Code Online (Sandbox Code Playgroud)
    Fur*_*anO 92
您需要添加enableReinitialize:true,如下所示.
let InitializeFromStateForm = reduxForm({
    form: 'initializeFromState',
    enableReinitialize : true // this is needed!!
})(UserEdit)
Run Code Online (Sandbox Code Playgroud)
如果您的initialValues道具得到更新,您的表单也会更新.
要设置initialValues它,在redux的reduxForm()装饰器之前应用装饰器很重要connect()。如果装饰器的顺序颠倒,这些字段将不会从商店状态填充。
const FormDecoratedComponent = reduxForm(...)(Component)
const ConnectedAndFormDecoratedComponent = connect(...)(FormDecoratedComponent)
Run Code Online (Sandbox Code Playgroud)
如果除了第一次设置值外,每次状态改变时都需要重新填充表单,然后设置 enableReinitialize: true
在这个答案中找到一个简单的例子。
阅读官方文档和完整示例。
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           29492 次  |  
        
|   最近记录:  |