React-Native-Material-Dropdown 不在前端显示数据

React-Native-Material-Dropdown not showing data on Front-end

我已经使用 react-native material 下拉菜单从我的 API 中获取数据,如下所示:

 <Dropdown
        label='colors'
        data={this.state.data.colors}
        containerStyle={{width: 50}}
      />
      {console.log("sbHASB",this.state.data.colors)}

然而,当我实施 thi 时,我确实在我的日志中得到了颜色,但它们似乎没有出现在列表中,它似乎是空白的,谁能告诉我为什么不是这样? 任何帮助都会很棒,谢谢。

我实现后的日志如下:

 sbHASB ["Blue", "White", "Blue", "White", "Blue", "White", "Blue", "White"]

如果您还需要什么,请告诉我。

假设您使用的是 react-native-material-dropdown,其 github 上的文档建议数据属性应该是具有值键的对象列表。请参阅此处给出的示例。

import React, { Component } from 'react';
import { Dropdown } from 'react-native-material-dropdown';

class Example extends Component {
  render() {
    let data = [{
      value: 'Banana',
    }, {
      value: 'Mango',
    }, {
      value: 'Pear',
    }];

    return (
      <Dropdown
        label='Favorite Fruit'
        data={data}
      />
    );
  }
}

为了使您的列表正常工作,您应该将其转换为匹配此格式,例如

const data = this.state.data.colors.map((color) => ({value: color}))

鉴于您上面的示例,它可能看起来像

<Dropdown
   label='colors'
   data={this.state.data.colors.map((color) => ({value: color}))}
   containerStyle={{width: 50}}
/>

但是我建议在此步骤之前转换数据,例如当您收到来自 api 的响应时。

在 snack.io 上查看此示例,如果您在设备上预览下拉菜单,效果最佳,因为动画无法在 Web 预览中正确显示。

https://snack.expo.io/@dannyhw/dropdown

更新: 这是更新的示例,其中包括一个如何动态使用它的示例

export default class App extends React.Component {
  state = {
    data: {colors: []}
  }

  getSomeData() {
    // imagine this is your api call here and it returns a promise that resolves to be a list of colours
    return Promise.resolve(["green", "White", "Blue", "White", "Blue", "White", "Blue", "White"])
  }

  componentDidMount(){
    this.getSomeData().then((result)=> {
      this.setState(state => state.data.colors = result) 
    })
  }

  render() {    
    return (
      <View style={styles.container}>
        <Dropdown
          label='colors'
          data={this.state.data.colors.map((color) => ({value: color}))}
          containerStyle={{width: 150}}
        />
      </View>
    );
  }
}