【问题标题】:Render items from 2D Array in React Native JSX在 React Native JSX 中从 2D 数组渲染项目
【发布时间】:2020-06-18 13:55:33
【问题描述】:

我想创建一个基于二维数组的菜单:标题和图标名称。
这是我尝试过的:

class Menu2 extends React.Component{
  constructor(props) {
   super(props);
   this.state = { Items: [['Home','home'],['User','user'],['Messages','envelope'], ['Finances','wallet'], ['Meal','silverware-fork-knife']]}
 }

 render(){
   <View style={styles.menu}>
   {this.state.Items.map((Items,i) => {
     return(
       <TouchableOpacity style={[styles.menu_item,styles.menu_item]} onPress={() => {this.props.navigation.navigate(Items[i][0]);}}>
       <FontAwesome name={Items[i][1]} size={40} color="#fff"/>
         <Text style={styles.menu_text}>{Items[i][0]}</Text>
       </TouchableOpacity>
     )
   })};
    </View>
 }
}

export default Menu2

返回的错误是“TypeError undefined is not an object (evalating 'Items[i][1]')”

我所期望的是“i”将通过我的数组的迭代 0、1、2、3、4(在我的情况下循环 5 次),因此 Items[i][0] = 标题和 Items [i][1] = 图标名称。 但我无法让它像我希望的那样工作。

有什么想法吗?

【问题讨论】:

    标签: javascript reactjs react-native react-native-android jsx


    【解决方案1】:

    您错误地使用了.map

    MDN documentation for Array.prototype.map() 展示了如何为此使用回调

    function callback(currentValue, index, array)
    

    您的回调 this.state.Items.map((Items,i) =&gt;currentValue 放入名为 Items 的变量中,但随后您使用 Items,就好像它是完整的数组一样!

    解决方案

    试试这个:

       {this.state.Items.map((currentItem) => {
         return(
           <TouchableOpacity style={[styles.menu_item,styles.menu_item]} onPress={() => {this.props.navigation.navigate(currentItem[0]);}}>
           <FontAwesome name={currentItem[1]} size={40} color="#fff"/>
             <Text style={styles.menu_text}>{currentItem[0]}</Text>
           </TouchableOpacity>
         )
       })};
    

    【讨论】:

    • 好的,谢谢它现在似乎工作得更好,但我无法设法将它导入其他地方,例如在我的主页上我有 import Menu2 from './Menu' 然后在 render() 中进一步我称之为: &lt;Menu2 navigation={this.props.navigation} /&gt; 它让我Invariant Violation: Menu2(...) 没有从渲染返回。
    • @sNNNk 这是一个不同的问题,这是因为您的 render() 函数中没有 return 语句。在函数顶部添加return ( 行,在&lt;View&gt; 上方,然后在函数末尾关闭)。那应该可以解决它。
    • 这样更好,但我仍然出现错误“文本字符串必须在 组件中呈现。”我找不到错误在哪里
    • @sNNNk 既然您最初发布的问题已经解决,最好在这里接受答案并发布一个新问题。我不一定知道您的新问题的答案,如果它发布在 cmets 中,其他人将无法看到它。
    【解决方案2】:

    应该是 Items[0]

          <FontAwesome name={Items[1]} size={40} color="#fff"/>
             <Text style={styles.menu_text}>{Items[0]}</Text>
           </TouchableOpacity>
    

    检查此工作代码框https://codesandbox.io/s/proud-cache-gyuge

    【讨论】:

    • 好的,谢谢,没有正确使用地图,现在它似乎工作得更好,但我无法将它导入其他地方,例如在我的主页上我有import Menu2 from './Menu' 然后在渲染中进一步() 我称之为:&lt;Menu2 navigation={this.props.navigation} /&gt; 它让我得到Invariant Violation: Menu2(...) 没有从渲染返回。
    猜你喜欢
    • 2021-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多