📜  Material-UI:一个组件在初始化后正在改变一个不受控制的 Select 的默认值状态.要抑制此警告,请选择使用受控选择. - Javascript(1)

📅  最后修改于: 2023-12-03 15:32:49.957000             🧑  作者: Mango

Material-UI:一个组件在初始化后正在改变一个不受控制的 Select 的默认值状态.要抑制此警告,请选择使用受控选择.

如果你正在使用 Material-UI 的 Select 组件,并且遇到了以下警告信息:

Warning: A component is changing an uncontrolled input of type select to be controlled. 
This is likely caused by the value changing from undefined to a defined value, which should not happen. 
Decide between using a controlled or uncontrolled select element for the lifetime of the component.

那么这篇文章就是为你准备的。

警告信息的含义

这个警告信息的含义是,Select 组件在初始化之后发现其默认值状态为未定义(undefined),然后将其改变为已定义(defined)。

这是不受控制的(uncontrolled)状态,因为它是由组件内部自动处理的,而没有任何外部控制。这种情况下,React 通常会发出警告,提示你使用受控制(controlled)的状态代替不受控制的状态。

解决方法

要抑制此警告,你可以选择使用受控制(controlled)的选择控件(Select)。

受控制的选择控件是指由组件外部明确控制的选择控件。具体而言,它受到一个状态变量的控制,该变量定义了当前选择控件所选项的值。

因此,为了使用受控制的选择控件,你需要在组件外部使用状态变量来存储当前选择控件所选项的值,并将该值作为 props 传递给选择控件。

以下是一个示例代码,展示了如何使用受控制的选择控件来替代不受控制的选择控件:

import { useState } from 'react';
import { Select, MenuItem } from '@material-ui/core';

function ControlledSelect() {
  const [value, setValue] = useState('');

  const handleChange = (event) => {
    setValue(event.target.value);
  };

  return (
    <Select value={value} onChange={handleChange}>
      <MenuItem value="option1">Option 1</MenuItem>
      <MenuItem value="option2">Option 2</MenuItem>
      <MenuItem value="option3">Option 3</MenuItem>
    </Select>
  );
}

这个示例代码中,我们使用 useState 钩子函数来声明一个状态变量 value,该变量用于存储当前选择控件所选项的值。然后,我们使用 handleChange 函数来更新该值,并将其作为 value prop 传递给选择控件。

最后,我们将 MenuItem 组件作为 Select 组件的子组件,用于定义选择控件的选项。

结论

如果你遇到了 Material-UI 的 Select 组件抛出的不受控制状态警告信息,那么你需要使用受控制的选择控件来解决该问题。

使用受控制的选择控件是一种更加规范的做法,因为它可以避免意外的状态变化,并使组件的逻辑更加明确。同时,它还可以使组件更加易于测试和维护。

因此,我们强烈建议你始终使用受控制的选择控件来构建你的应用程序。