首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >setState组件中的setState呈现整个组件

setState组件中的setState呈现整个组件
EN

Stack Overflow用户
提问于 2021-11-21 03:35:40
回答 1查看 38关注 0票数 1

我有一个ant设计模式,我使用setState调用它,它调用一个独立的组件,其中包含一个ant设计表单,该表单在模式主体内呈现,这就是功能组件的样子。

代码语言:javascript
复制
export default function EditTableCell({ record}) {
const [colorSwatch, setColorSwatch] = React.useState(record.color)
const [colorPalletVisible, setColorPalletVisible] = React.useState(false)


if (record === 'add') {
    form.setFieldsValue({
      description: '',
      notes: '',
    })
  }
    
    return (
         <Form>
          <Form.Item
           label="description"
           name="description"
          >
           <Input />
          </Form.Item>
        </Form>


        <Form.Item name="color" noStyle>
          <Avatar
            size={32}
            icon={<FormatPainterFilled />}
            style={{ backgroundColor: colorSwatch }}
            onClick={() => setColorPalletVisible(!colorPalletVisible)}
          />
        </Form.Item>
    )

现在的问题是,每当我调用setColorPalletVisible时,组件都会重新呈现,我输入的初始表单值也会重新出现,这意味着当用户输入表单字段值,然后进行颜色选择时,它就会重新呈现,并且他们会丢失键入的数据。那么如何让它的组件按预期运行呢?

https://ant.design/components/form/

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-21 04:42:28

您的组件主体不应该调用任何可能会改变状态和调用重新呈现函数的内容。

每次调用setState方法时,在本例中setColorPalletVisible React都会重新呈现组件。但是,这里有if语句,每次调用组件re-renders (又称setColorPalletVisible )时都会执行该语句。

record变量的值发生更改时,您需要调用form.setFieldsValue,因此其他突变不应该调用此函数。这称为side effect

在这里你可以读到Rect提供的钩子来处理这种情况。

https://reactjs.org/docs/hooks-effect.html

简而言之,为了实现基于某些依赖项的副作用,您应该调用useEffect钩子,它将在依赖项数组发生变化后执行代码。

在下面的代码中,仅当record值已更改且等于add时,才会调用form.setFieldsValueuseEffect依赖数组可以为空,只有在组件初始呈现后才会调用回调函数。

代码语言:javascript
复制
export default function EditTableCell({ record}) {
  const [colorSwatch, setColorSwatch] = React.useState(record.color)
  const [colorPalletVisible, setColorPalletVisible] = React.useState(false)

  useEffect(() => {
    if (record === 'add') {
      form.setFieldsValue({
        description: '',
        notes: '',
      })
    }
  }, [record])

  return (
     <Form>
        <Form.Item
         label="description"
         name="description"
        >
         <Input placeholder={t.payitemsGroupPage.enterPayitem} />
        </Form.Item>
      </Form>


      <Form.Item name="color" noStyle>
        <Avatar
          size={32}
          icon={<FormatPainterFilled />}
          style={{ backgroundColor: colorSwatch }}
          onClick={() => setColorPalletVisible(!colorPalletVisible)}
        />
      </Form.Item>
  )
}

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70051628

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档