【问题标题】:Material UI autocomplete with redux-form values getting destroyed材料 UI 自动完成,redux-form 值被破坏
【发布时间】:2020-09-23 09:37:44
【问题描述】:

我正在尝试将 Material UI 的自动完成组件与 redux 向导表单一起使用

我能够链接材料 UI 提供的自动完成功能,但是当我返回上一页并返回自动完成字段所在的第二页时,尽管将 destroyOnUnmount 设置为 false,但该字段仍被销毁。 (所有其他字段都不会被破坏,但只有第 2 页中使用材料 UI 自动完成功能的字段)实际上我认为它不会被破坏,因为该值仍然存在,您只是在输入中看不到它

此外,当我单击提交时,主要爱好部分的值会通过,但多爱好部分的值不会通过。任何人都可以看看,看看有什么问题吗?谢谢

【问题讨论】:

    标签: javascript reactjs react-redux material-ui redux-form


    【解决方案1】:

    您需要定义AutoComplete的value属性,以便在您再次访问表单时显示选择的值。

    你必须注意,爱好表单中的两个字段需要定义不同的名称

    还有多选AutoComplete的onChange值需要通知reduxForm这个变化

    MultipleComplete.js

    import React from "react";
    import { TextField } from "@material-ui/core";
    import { Autocomplete } from "@material-ui/lab";
    const hobbies = [
      { title: "WATCHING MOVIE" },
      { title: "SPORTS" },
      { title: "MUSIC" },
      { title: "DRAWING" }
    ];
    
    const MultipleComplete = ({
      input,
      meta: { touched, error, submitFailed }
    }) => {
      const { onChange, ...rest } = input;
      return (
        <div>
          <Autocomplete
            multiple
            limitTags={2}
            value={input.value || []}
            id="multiple-limit-tags"
            options={hobbies}
            onChange={(e, newValue) => {
              onChange(newValue);
            }}
            getOptionLabel={option => option.title}
            getOptionSelected={(option, value) => option.title === value.title}
            renderInput={params => (
              <TextField
                {...params}
                variant="outlined"
                placeholder="Choose Multiple Hobbies"
                fullWidth
              />
            )}
          />
        </div>
      );
    };
    export default MultipleComplete;
    

    AutoHobbyComplete.js

    import React from "react";
    import { TextField } from "@material-ui/core";
    import { Autocomplete } from "@material-ui/lab";
    const hobbies = [
      { title: "WATCHING MOVIE" },
      { title: "SPORTS" },
      { title: "MUSIC" },
      { title: "DRAWING" }
    ];
    
    const AutoHobbyComplete = ({
      input,
      meta: { touched, error, submitFailed }
    }) => {
      const getSelectedOption = () => {
        return hobbies.find(o => o.title === input.value);
      };
      const { onChange, ...rest } = input;
      return (
        <div>
          <Autocomplete
            autoSelect
            value={getSelectedOption()}
            options={hobbies}
            autoHighlight
            getOptionLabel={option => option.title}
            onChange={(event, newValue) => onChange(newValue)}
            getOptionSelected={(option, value) => {
              return option.title === value.title || option.title === input.value;
            }}
            renderInput={params => {
              return (
                <TextField
                  {...params}
                  {...rest}
                  value={input.value}
                  variant="outlined"
                  fullWidth
                />
              );
            }}
          />
        </div>
      );
    };
    
    export default AutoHobbyComplete;
    

    【讨论】:

    • AutoHobbyComplete 似乎运行良好,但是当我在输入多个爱好后尝试按下一步时,字段被清除并且没有值通过。你能检查一下这个问题吗?
    • 当然让我看看然后回来
    • 更新了演示。只是从 MultipleComplete.js 中的 TextField 中删除 {...rest} 的问题。输入参数中的 onBlur 函数会清除数据,因为那里的期望不同
    • 干杯它有效。如果我尝试返回或按下一步然后返回到第二页以更改第一个字段(autohobbycomplete),我会收到一条错误消息,提示值未定义。如果我写 if (value) { return option.title === value.title || option.title === input.value; } 应该没问题吧?
    • 为您需要的更改更新了演示
    【解决方案2】:

    看来你是对的,只是值没有正确显示。如果您能够从 redux 表单中获取值,则可以将该值作为 inputValue 传递给自动完成。这将在文本框中显示值。确保使用 inputValue 而不是 value。

     <Autocomplete
            inputValue={//this is where your redux form value should be displayed}
            autoSelect
            options={hobbies}
            autoHighlight
            getOptionLabel={option => option.title}
            onChange={(event, newValue) => console.log(newValue)}
            getOptionSelected={(option, value) => option.title === value.title}
            renderInput={params => (
              <TextField {...params} {...input} value="test" variant="outlined" fullWidth />
            )}
          />
    

    【讨论】:

    • 我看到第二页的第二个字段怎么样?我认为没有任何价值观可以通过这个
    猜你喜欢
    • 2017-09-28
    • 2020-09-05
    • 2022-08-09
    • 2020-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-24
    相关资源
    最近更新 更多