React Formik Material UI自动完成功能:如何在localStorage的自动完成功能中填充值?

你会惊讶的

因此,我正在尝试使用Formik和Material UI创建表单。对于所有字段,一切都可以正常工作,但是问题在于自动完成功能。我找不到从localStorage填充字段的方法。我尝试了一切,从放置值props,inputValue,defaultValue等开始,但是似乎没有任何效果。

import React from 'react'
import { Grid } from '@material-ui/core'
import { Autocomplete } from '@material-ui/lab'
import { Formik, Form, Field } from 'formik'
import { TextField } from 'formik-material-ui'
import * as yup from 'yup'
import { nationality } from '../../constants/nationality'
import Button from '../Button/Button'

export default function ForeignAddress () {

  let localStorageData = localStorage.getItem('foreignAddress'),
    retrivedData = JSON.parse(localStorageData)


  const handleNextClick = () => {
    console.log('clicked next')
  }

  const handleBackClick = () => {
    console.log('clicked back')
  }

  const validationSchema = yup.object({
    streetName: yup.string().required('Street name is required'),
    streetNumber: yup.string().required('Street number is required'),
    postalCode: yup.string().required('Postal code is required'),
    city: yup.string().required('City is required'),
    country: yup.string().required('Country is required'),
  })

  console.log(retrivedData)

  return (
    <React.Fragment>
      <div className="pages-wrapper address">
        <Formik
          initialValues={retrivedData ? retrivedData : {streetName: '', streetNumber: '', postalCode: '', city: '', coAddress: '', country: ''}}
          onSubmit={(data) => {
            console.log(data)
            localStorage.setItem('foreignAddress', JSON.stringify(data))
            handleNextClick()
          }}
          validationSchema={validationSchema}
        >
          {({setFieldValue}) => (
            <Form>
              <Grid container spacing={3}>
                <Grid item xs={12} md={8}>
                  <Field component={TextField} name="streetName" label="Street Name" variant="outlined" fullWidth />
                </Grid>
                <Grid item xs={12} md={4}>
                  <Field component={TextField} name="streetNumber" label="Street Number" variant="outlined" fullWidth />
                </Grid>
                <Grid item xs={12} md={4}>
                  <Field component={TextField} name="postalCode" label="Postal Code" variant="outlined" fullWidth />
                </Grid>
                <Grid item xs={12} md={8}>
                  <Field component={TextField} name="city" label="City" variant="outlined" fullWidth />
                </Grid>
                <Grid item xs={12} md={6}>
                  <Field component={TextField} name="coAddress" label="C/O Address" variant="outlined" fullWidth />
                </Grid>
                <Grid item xs={12} md={6}>
                  <Autocomplete
                    id="foreignCountry"
                    className="country-select"
                    name="country"
                    options={nationality}
                    getOptionLabel={option => option.label}
                    onChange={(e, value) => {
                      console.log(value)
                      setFieldValue("country", value.code)
                    }}
                    renderInput={params => (
                      <Field component={TextField} {...params} name="country" label="Country" variant="outlined" fullWidth/>
                    )}
                  />
                </Grid>
              </Grid>
              <div className="button-wrapper">
                <Button label="Back" go="back" handleClick={handleBackClick}/>
                <Button label="Next" go="next" type="submit" />
              </div>
            </Form>
          )}
        </Formik>
      </div>
    </React.Fragment>
  )
}

编辑:

感谢@Vencovsky我能够完成它

万一将来有人需要,这里是工作代码。只需将自动完成组件更改为

<Autocomplete
  id="foreignCountry"
  className="country-select"
  name="country"
  options={nationality}
  getOptionLabel={option => option.label}
  defaultValue={values.country}
  onChange={(e, value) => {
    console.log(value)
    setFieldValue("country", value)
}}
  renderInput={params => (
    <Field component={TextField} {...params} name="country" label="Country" variant="outlined" fullWidth/>
)}
/>

在Formik道具中只需添加值道具

{({setFieldValue, values}) => (
   <Form>,...
文科夫斯基

编辑:

您需要更改几件事。

首先,您不能只存储代码以供稍后加载,还需要存储选项中的所有内容(孔value对象)。

更改的初始值country: ''country: {code: "", label: "", phone: ""}这是选项的所有缺省值。

然后加载值正确,您应该通过value={values.country}地方values从formik道具来。

然后onChange保存孔值onChange={(e, value) => {setFieldValue("country", value); }}

但是您也正在导入和使用一些错误的东西,例如

  <Field
    component={TextField}
    {...params}
    name="country"
    label="Country"
    variant="outlined"
    fullWidth
  />

FieldFormik和TextFieldFormik材质ui在哪里

不知道为什么要这样使用它,但是我已经更改了它。

这是一个有效的例子

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Formik和Material-UI

在React material-UI自动完成中获取值

Formik Material UI React-自动完成-不受控制到受控状态

React不会渲染自动完成功能

如何在Vim中将React jsx添加为JavaScript文件类型并启用eslinting,自动完成功能?

重新打开Angular Material自动完成功能

material-ui 1.0-如何使用自动完成功能创建芯片输入?

Formik和React-自动完成

如何在Android中使用自动完成功能将Material Design Chips添加到输入字段?

结合使用ngValue和Angular Material自动完成功能?

如何将Material-UI自动完成功能与react-virtualized一起使用?

React material-ui KeyboardDatePicker和Formik无法正常工作

从自动完成内失去React Material UI打开模式

设置TextField InputProps时Material-UI自动完成功能不起作用

通过Material UI自动完成功能按名称或ID进行搜索

Formik,Material UI自动完成和Firestore-在哪里查询以找到数组参数

标签中的Formik React

React Material UI自动完成功能不适用于Formik

material-ui使用带有差异值的自动完成功能,选项类型

如何在Material UI自动完成功能中向清除按钮图标添加/编辑功能?

React Formik:如何对Formik值使用Effect?

在 freeSolo 模式下使用带有 react-hook-form 的 Material UI 自动完成功能

使用 material-ui 自动完成功能搜索多个域

向 Typescript/React 组件添加自动完成功能

Formik 表单无法识别 Material ui 按钮

如何在 react-hook-from 中使用 material-ui 自动完成功能

如何在自动完成的 onChange 中传递索引 - React Material UI

如何在 material-ui 自動完成中覆蓋自動完成/自動填充 - React JS

React Material UI - 如何根据另一个值自动从自动完成中删除项目