在从 API 调用填充的反应选择下拉列表中设置默认值

Posted

技术标签:

【中文标题】在从 API 调用填充的反应选择下拉列表中设置默认值【英文标题】:Setting a default value on a react select dropdown that is populated from an API call 【发布时间】:2019-11-01 16:35:54 【问题描述】:
class Select extends React.PureComponent 
    constructor(props) 
        super(props)
        this.state =  value: this.props.defaultValue 
        this.handleChange = this.handleChange.bind(this)
    

    handleChange(e) 
        e.persist()
        if (typeof this.props.onDataChange !== 'undefined') 
            this.setState( value: e.target.value , () => this.props.onDataChange(e))
         else 
            this.setState( value: e.target.value )
        
    

    render() 
        const  options  = this.props
        return (
            <div>
                <select
                    value=this.state.value
                    onChange=this.handleChange
                >
                    options.map((option, i) => 
                        const value = option.value || option.path || null
                        const label = option.label || option.name || option

                        return (
                            <option key=`option-$i` value=value>
                                label
                            </option>
                        )
                    )
                </select>
            </div>
        )
    


class Display extends React.PureComponent 
    constructor(props) 
        super(props)
    

    async getSomeValues() 
        try 
            this.setState( isReady: false )
            await Axios.get(`some-values`)
                .then(async (result) => 
                    this.setState(
                        values: result.data.values,
                        default: result.data.default
                    )
                )
         catch (error) 
            console.log(error)
         finally 
            this.setState( isReady: true )
        
    

    componentDidMount() 
        this.getSomeValues()
    

    render() 
        return (
            <Select 
                options=this.state.values 
                defaultValue = this.state.defaultValue 
            />
        )
    

我正在尝试解决我认为非常简单的问题。我有一个父组件,其中包含一个正在呈现选择下拉列表的子组件。

我的父母调用 API 服务并拉回要在选择下拉列表中显示的项目列表。我的 API 返回要显示的选项集和加载时选择的初始值。

初始渲染采用 defaultValue 属性并将状态设置为在选择组件构造函数的初始实例中显示,我遇到的问题是 api 调用是在初始渲染之后完成的,所以默认值总是结果是空的。

我需要一种机制来将选择下拉列表的值设置为加载时的初始值,但它必须作为组件加载后发生的 api 调用的结果来完成?

将状态值设置为初始加载时从 API 返回的值的最简洁方法是什么?

我确信这一定是一个容易解决的问题,但我一直在我想做的事情和反应中的加载/渲染模式之间陷入困境。

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

我看到两个选项:

选项 1

您可以阻止Select 组件的呈现,直到请求完成。这意味着您的构造函数将在您获得数据后触发并正确初始化。

render() 
  if (this.state.defaultValue) 
    return (
      <Select 
        options=this.state.values 
        defaultValue=this.state.defaultValue 
      />
    )
   else 
    return null; // or loading graphic
  

选项 2

在您的Select 组件中,使用componentDidUpdate 之类的生命周期方法来检查defaultValue 属性是否与上次渲染相比发生了变化。如果是这样,请在 state 中设置默认值。这将使defaultValue 只设置一次。

componentDidUpdate(prevProps) 
  if (this.props.defaultValue !== prevProps.defaultValue) 
    this.setState( defaultValue: this.props.defaultValue );
  

【讨论】:

选项 2 绘制了一个反应 linting 问题警告不要这样做。不过,选项 1 的延迟渲染对我有用。感谢您的帮助 如果您将 react hook 表单与 react select 一起使用,选项 1 不可行,因为 react hook 表单库需要渲染选择以设置默认值,并且无法使用已设置的默认值渲染 react select (为未定义),因为它们在数据加载后无法再次设置。我通过将默认道具直接发送到选择组件来解决这个问题,以便它可以在第一次渲染时使用它。我不喜欢这个解决方案,因为它将这个选择的默认值与通常的反应钩子表单默认值分开,但我找不到任何其他解决方案。 我找到了一个解决方案,只需从react hook form watch中读取defaultValues,watch在注册输入之前就有react hook form默认值。

以上是关于在从 API 调用填充的反应选择下拉列表中设置默认值的主要内容,如果未能解决你的问题,请参考以下文章

使用Angularjs在选择下拉菜单中设置默认值

如何使用 jquery 和 php 从动态数据中设置默认下拉列表?

在角度多选选项卡中设置文本

Excel中设置下拉菜单并填充不同颜色

如何使用react js在select中设置默认值

如何在 IE 中的 HTML 选择下拉列表中设置字体系列? [复制]