【问题标题】:Submitting untouched redux-form with initialValues converts react-select values to array of null使用 initialValues 提交未修改的 redux-form 会将 react-select 值转换为 null 数组
【发布时间】:2018-06-16 01:54:27
【问题描述】:

我正在使用本指南将 react-selectredux-form 集成:https://gist.github.com/leocristofani/98312e61807db8f32e720c9f97a186e5

import React, { PropTypes } from 'react';
import Select from 'react-select';
import 'react-select/dist/react-select.css';

RFReactSelect.defaultProps = {
  multi: false,
  className: ""
};

RFReactSelect.propTypes = {
  input: PropTypes.shape({
    name: PropTypes.string.isRequired,
    value: PropTypes.string.isRequired,
    onBlur: PropTypes.func.isRequired,
    onChange: PropTypes.func.isRequired,
    onFocus: PropTypes.func.isRequired,
  }).isRequired,
  options: PropTypes.array.isRequired,
  multi: PropTypes.bool,
  className: PropTypes.string
};

export default function RFReactSelect({ input , options, multi, className }) {
  const { name, value, onBlur, onChange, onFocus } = input;
  const transformedValue = transformValue(value, options, multi);
  return (
    <Select
      valueKey="value"
      name={name}
      value={transformedValue}
      multi={multi}
      options={options}
      onChange={multi
        ? multiChangeHandler(onChange)
        : singleChangeHandler(onChange)
      }
      onBlur={() => onBlur(value)}
      onFocus={onFocus}
      className={className}
    />
  );
}

/**
 * onChange from Redux Form Field has to be called explicity.
 */
function singleChangeHandler(func) {
  return function handleSingleChange(value) {
    func(value ? value.value : '');
  };
}

/**
 * onBlur from Redux Form Field has to be called explicity.
 */
function multiChangeHandler(func) {
  return function handleMultiHandler(values) {
    func(values.map(value => value.value));
  };
}

/**
 * For single select, Redux Form keeps the value as a string, while React Select 
 * wants the value in the form { value: "grape", label: "Grape" }
 * 
 * * For multi select, Redux Form keeps the value as array of strings, while React Select 
 * wants the array of values in the form [{ value: "grape", label: "Grape" }]
 */
function transformValue(value, options, multi) {
  if (multi && typeof value === 'string') return [];

  const filteredOptions = options.filter(option => {
    return multi 
      ? value.indexOf(option.value) !== -1
      : option.value === value;
  });

  return multi ? filteredOptions : filteredOptions[0];
}

尽管有一个问题(到目前为止),但这仍然有效。

当我设置表单的initialValues并在不触及react-select组件的情况下提交它时,它将select的初始值从["id1", "id2", "id3"]转换为[null,null,null]。

【问题讨论】:

    标签: reactjs redux react-redux redux-form react-select


    【解决方案1】:

    没关系。经过一个月的拉扯我的头发后,终于能够从头开始解决它。作为新手,我必须检查很多活动部件,但没有检查。

    【讨论】:

    • 效果如何?如果可能的话,你能分享一下工作代码吗? @DigitalDouble
    • @LalitKushwah,您遇到的具体问题是什么?
    猜你喜欢
    • 2018-07-18
    • 2018-06-06
    • 1970-01-01
    • 2017-12-18
    • 2018-09-19
    • 1970-01-01
    • 1970-01-01
    • 2018-05-08
    • 1970-01-01
    相关资源
    最近更新 更多