【问题标题】:How to loop and render elements in React-native?如何在 React-native 中循环和渲染元素?
【发布时间】:2017-07-20 01:49:48
【问题描述】:

是否可以在 Render 函数中循环相同的组件?

类似这样的:

...

onPress = () => {
 ...
};

initialArr = [["blue","text1"],["red","text2"]];
buttonsListArr = [];

for (let i = 0; i < initialArr.length; i++) 
{
 buttonsListArr.push(
   <Button style={{borderColor:{initialArr[i][0]}}} onPress={this.onPress.bind(this)}>{initialArr[i][1]}</Button>
 );
}

...

render() {
  return (
    <View style={...}>
     {buttonsListArr}
    </View>
)};

我的意思是这只是有限的组件列表,因此 ListView/ScrollView 等任何组件都不适用于这种特殊情况。这只是语法问题。

【问题讨论】:

  • 你为什么不用地图呢? const buttons = buttonsListArr.map( item =&gt; &lt;Button style={{borderColor:item[0]}} onPress={this.onPress.bind(this)}&gt;{item[1]}&lt;/Button&gt;render() { return ( &lt;View style={...}&gt; &lt;buttons /&gt; &lt;/View&gt; )};

标签: react-native


【解决方案1】:

你通常会用地图来做那种事情。

buttonsListArr = initialArr.map(buttonInfo => (
  <Button ... key={buttonInfo[0]}>{buttonInfo[1]}</Button>
);

(当你在 React 中做映射时,key 是一个必要的 prop。key 需要是生成组件的唯一标识符)

另一方面,我会使用对象而不是数组。我发现它看起来更好:

initialArr = [
  {
    id: 1,
    color: "blue",
    text: "text1"
  },
  {
    id: 2,
    color: "red",
    text: "text2"
  },
];

buttonsListArr = initialArr.map(buttonInfo => (
  <Button ... key={buttonInfo.id}>{buttonInfo.text}</Button>
);

【讨论】:

  • 感谢您的回答。你能解释一下为什么使用地图吗?我正在尝试 forEach 并没有奏效。我对为什么必须使用地图感到困惑。
  • @AlexWang 您使用 map 是因为 for each 只是简单地遍历元素,而 map 返回一个相同大小的数组,其中填充了映射函数的结果。
  • 类似反应的渲染是基于 returnsforEach 不返回任何东西(从内部)但是,因此不适合基于返回的渲染循环 :-) 但是如果您不想渲染并只是记录数据/将它们发送出去(基本上除了返回之外的任何东西),那么 @ 987654324@ 在语义上更有意义:)
【解决方案2】:
render() {
  return (
    <View style={...}>
       {initialArr.map((prop, key) => {
         return (
           <Button style={{borderColor: prop[0]}}  key={key}>{prop[1]}</Button>
         );
      })}
     </View>
  )
}

应该做的伎俩

【讨论】:

  • 看起来不错,但我会将映射移到 return 语句之前以使事情看起来更好,并且只在视图中使用映射的数组变量名称。请注意,map 函数的第二个参数是您正在遍历的数组中元素的索引。尽管它们可能每次都是不同的整数,但它们可能不一定是关键属性的良好候选者。数组元素可能会更改,因此键也必须更改(如果您使用唯一标识符,即使索引已更改,键也将保持不变)。
  • 根据 React 文档,“如果项目可以重新排序,我们不建议对键使用索引,因为那样会很慢。” -- facebook.github.io/react/docs/lists-and-keys.html(键部分,底部)跨度>
  • @nbkhope 这对我来说是关于密钥的新信息。谢谢!
【解决方案3】:

对于初始数组,最好使用对象而不是数组,这样你就不用担心索引了,它会更清楚什么是什么:

const initialArr = [{
    color: "blue",
    text: "text1"
}, {
    color: "red",
    text: "text2"
}];

对于实际映射,使用 JS 数组映射而不是 for 循环 - 应该在没有定义实际数组的情况下使用 for 循环,例如显示一定次数的东西:

onPress = () => {
    ...
};

renderButtons() {
    return initialArr.map((item) => {
        return (
            <Button 
                style={{ borderColor: item.color }}
                onPress={this.onPress}
            >
                {item.text}
            </Button>
        );
    });
}

...

render() {
    return (
        <View style={...}>
            {
                this.renderButtons()
            }
        </View>
    )
}

我将映射移动到渲染方法之外的单独函数,以获得更易读的代码。 在 react native 中还有许多其他方法可以循环遍历元素列表,而您将使用哪种方式取决于您需要做什么。大多数这些方法都在this article about React JSX loops 中进行了介绍,尽管它使用了 React 示例,但其中的所有内容都可以在 React Native 中使用。如果您对此主题感兴趣,请查看!

另外,不是关于循环的话题,但由于您已经使用数组语法来定义 onPress 函数,因此无需再次绑定它。同样,这仅适用于在组件中使用此语法定义函数的情况,因为箭头语法会自动绑定函数。

【讨论】:

  • 如果有人在重新创建此答案时遇到问题,请记住 &lt;Button /&gt; 是自我关闭(据我所知)并在其中显示文本必须通过道具(属性又名属性)@ 987654326@More about Button here
  • 为什么 renderButtons 函数有 2 个返回语句?
【解决方案4】:

如果你想要直接/快速,而不考虑变量:

{
 urArray.map((prop, key) => {
     console.log(emp);
     return <Picker.Item label={emp.Name} value={emp.id} />;
 })
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-11
    • 2017-08-11
    • 2016-03-14
    • 2019-08-15
    • 2018-03-29
    • 1970-01-01
    • 2019-08-31
    • 1970-01-01
    相关资源
    最近更新 更多