javascript - React Native - 动态 onPress 事件

标签 javascript reactjs react-native

我是 react-native 的新手,我遇到了一些我不确定如何解决的问题。

我有一些组件可以根据一些 API 数据动态呈现。

for (var i = 0; i < data.length; i++)
{    
    categoryComponents.push(
        <Card key={data[i].id}>
            <CardItem>
                <Body>
                    <TouchableHighlight onPress={(event) => {
                        const { navigate } = this.props.navigation;
                        navigate('Category', { category: data[i].id });
                    }}>
                        <Text>{data[i].name + "  " + data[i].id}</Text>
                    </TouchableHighlight>
                </Body>
            </CardItem>
        </Card>
    );
}

如您所见,我将动态组件存储在一个数组中。我将其渲染到屏幕上:

render() {
    return (
        <Container>
            <Content style={styles.spacer}>{categoryComponents}</Content>
        </Container>
    )
}

问题是在我的 TouchableHighlight 组件中,onPress 事件似乎不接受 data[i].id 变量.它会抛出一个错误,提示 undefined。但是,我在 onPress 事件之外使用它并且它已被定义。

我试图解决这个问题,所以我更改了我的代码:

for (var i = 0; i < data.length; i++)
{
    var name = data[i].name;
    var id = data[i].id;

    categoryComponents.push(
        <Card key={id}>
            <CardItem>
                <Body>
                    <TouchableHighlight onPress={(event) => {
                        const { navigate } = this.props.navigation;
                        navigate('Category', { category: id });
                    }}>
                        <Text>{name + "  " + id}</Text>
                    </TouchableHighlight>
                </Body>
            </CardItem>
        </Card>
    );
}

如您所见,我只是将要使用的值存储到局部变量中并引用这些变量而不是数据

这并没有解决问题,但让我有了更多的见解。

现在我的 TouchableHighlight 组件 onPress 事件接受变量,但它只使用循环赋值的最后一次迭代。

因此,在 TouchableHighlight 内的所有组件中,我的 id 变量总是分配给 9。即使在 onPress 事件之外,id 变量也在改变。

由于这个问题,我的链接都不是动态的。如何在 TouchableHighlight 组件上设置动态 onPress 事件?

编辑:我对组件使用 native-base

最佳答案

这与 React Native 无关,它与 javascript 作用域和闭包有关。

var 声明一个工作在函数作用域,而不是 block 作用域的变量。

由于onPress 方法被异步调用,i 变量是for 循环 之后的值。

将循环变量声明从 var 更改为 let 将解决此问题

// let declare a variable works at `block scope`
for (let i = 0; i < data.length; i++){}

您可能需要 How do JavaScript closures work?作为引用。

关于javascript - React Native - 动态 onPress 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46565771/

相关文章:

javascript - 为什么jQuery延迟不会导致闪烁 Action

javascript - 具有多个独立对象的 requestAnimationFrame

javascript - 不使用 ajax 或表单发布 JSON 数据

javascript - 如何使用 Tabs API 在 Material-UI 中水平对齐选项卡标签和选项卡图标

javascript - 使用 JSX 的 React Button 的 onClick 方法

javascript - 通过 aws Amplify 使用 Storage 类对 native 图像上传进行 react

react-native - react native : Error: Duplicate resources - Android

javascript - 如何在 JavaScript 中获取 ISO 8601 周的开始和结束日期时间?

reactjs - NextJs 13 中的图像组件如何工作?

ios - react native : Refs in ListView