当前位置: 首页 > 面试题库 >

来自外部交互的Redux-Form更新字段值

柴英博
2023-03-14
问题内容

我有一个连接到我的应用程序状态的redux表单,一切似乎都很好。我可以获取数据并将其加载到表单中,然后提交数据并获取所需的元数据…

但是,我有一个自定义交互(颜色选择器),需要动态更改托管字段的值。我尝试的所有操作都将更改屏幕,但不会更改redux表单状态,即,当我提交表单时,我只会获取原始字段数据,而不是表单中显示的新数据。

下面的版本将字段属性传递给组件,并尝试使用ColorSelect组件状态作为字段值。我也尝试过创建动作创建者,但是结果与该示例相同,并且代码更多。

注意:react@^15.4.2,react-redux@^5.0.2,redux-form@^6.4.3

...
import ColorSelect from './ColorSelect';


class CollectionForm extends Component {

    /**
     * On form submit accepted
     * @param values
     */
    onSubmit(values){

        //See screenshot for evidence
        log('Updating collection:', 'warn', values);

        //values.color is grey and not yellow!
        this.props.dispatch(updateCollection(values));
        return;
    }

    /**
     * Form render
     * @return {JSX}
     */
    render()
    {
        const { handleSubmit, submitting } = this.props;

        return (
            <form onSubmit={handleSubmit(this.onSubmit.bind(this))}>
                <Field component={renderTextInput} name="name" type="text" label="Name"/>
                <Field component={ColorSelect} name="color" />

                <div class="field-buttons right-align group">
                    <Button type="submit" disabled={submitting} primary>
                        Save
                    </Button>
                </div>
            </form>
        );
    }
};

//Redux form decorator
CollectionForm = reduxForm({ form: 'collectionForm' })(CollectionForm)

// State connector
CollectionForm = connect(
    state => ({
        initialValues: state.collections.activeCollection

    }), //MapStatetoProps
    {
        onLoad: fetchCollection
    }   //mapActionToProps
)(CollectionForm);

export default CollectionForm;

ES6:CollectionForm.js

import React, { Component } from 'react'
import { Field, reduxForm, SubmissionError } from 'redux-form';

const colors = [
    'grey', 'green', 'yellow', 'orange', 'red', 'purple', 'blue'
];

export default class ColorSelect extends Component {

    constructor(props){
        super(props);

        this.state = {
            selectedColor : this.props.input.value //Set to current <Field> input value
        };

        this.onSelect = this.onSelect.bind(this);
        this.renderColor = this.renderColor.bind(this);
    }

    /**
     * Color picker selected
     * @param color
     */
    onSelect(color){
        this.setState({ selectedColor: color }); //Sets correct state here
    }

    /**
     * Render a color list item
     * @param color
     * @return {JSX}
     */
    renderColor(color){

        const select = this.state.selectedColor === color ? "active" : "";
        const klass = color + " " + select;

        return <li key={color}>
            <a class={klass} onClick={(event) => this.onSelect(color)}></a>
        </li>
    }

    /**
     * Render color list action
     * @return {JSX}
     */
    render(){

        //Override field value with colorSelected state

        return (
            <div>
                <input {...this.props.input} value={this.state.selectedColor} name="color" type="text" label="Color" />

                <div class="color-selector">
                    <ul>
                        {colors.map((color) => this.renderColor(color) )}
                    </ul>
                </div>
            </div>
        );
    }
}

问题答案:

您可以将react-redux mapDispatchToPropschange操作创建者一起使用,以实现所需的功能:

import { Component } from "react";
import { connect } from "react-redux';
import { change } from "redux-form";

class ColorSelect extends Component {
  // ...other stuff in this class...

  renderColor (color) {
    const { selectColor } = this.props;
    return <li key={color}><a onClick={() => selectColor(color)}></a></li>;
  }
}

export default connect(null, {
  selectColor: color => change( "yourFormName", "yourFieldName", color )
})(ColorSelect)


 类似资料:
  • 问题内容: 我正在尝试用来自API的数据填写个人资料表单。不幸的是,在这种情况下,redux-form不想与我合作。由于某些原因,无论我做什么,字段都保持为空。 出于某些原因,设置固定值而不是从reducer传递的值效果很好。 也许这是因为我在动作创建者内部对API调用使用了 redux-promise ?我如何忍受它并摆脱它。这是我的表单组件。 我相信动作创建者也将很有用: 问题答案: 您需要添

  • 我使用的是Laravel,我试图使用HasOne::create方法从数组中创建一个相关记录。它插入相关记录,但不向主模型的外部字段添加新id。我做错了什么? 谢谢 关系工作正常,指定所有字段。由- var_dump结果-null 此外,$data['地址']包含有效数据,在地址模型中指定为可填充数据,address_id在联系人模型中可填充数据 UPD: 联系类: 地址类: $data['地址'

  • 问题内容: 使用v7时,我发现无法设置字段值。现在,在我中,我有两个部分。当第一个组件值更改时,第二个值将清除。 在课堂上渲染: 现在,我添加了更改钩子,以及如何更改其他值 问题答案: 您可以使用onChange逻辑并使用redux-form中的操作 根据文档: change(field:String,value:any):函数 更改Redux存储中字段的值。这是绑定动作的创建者,因此不返回任何内

  • 问题内容: 让我们考虑以下情况-“文章”文档中有两个字段- content(string)和views(int)。视图字段未建立索引。views字段包含此文章被阅读了多少次的信息。 来自官方文档: 我们还说过文件是不可变的:它们不能更改,只能替换。更新API必须遵守相同的规则。从外部看,似乎我们正在部分更新文档。但是,在内部,更新API仅管理与我们已经描述过的相同的检索- 更改-重新索引过程。 但

  • 问题内容: 我正在尝试使用React refs在安装时聚焦Redux-Form字段。 当我尝试时,会抛出一个错误: 当我console.log this.refs时,它通常是一个空对象,有时将’title’标识为ref,但它不是可靠的。 我是否正确使用了引用?我的代码在下面供参考。 … 问题答案: 请尝试使用回调函数设置ref: 然后使用它来获取基础的DOM节点: DOM输入元素是否包装在另一个元

  • 每次鼠标左键单击,递增,因此值始终在变化。我想要显示在条目字段,但我无法实现这一点。 如何使输入字段始终更新并在?