React Native使用多个组件而不共享状态

时间:2019-12-04 03:03:29

标签: reactjs react-native expo

我正在构建一个React Native应用,并且试图使用列表中的多个相同组件。我有一个组件ListItem,它拥有自己的状态,其中包含一个名称。然后,我有一个MyList组件,该组件使用地图来渲染一堆ListItems。

我在ListItem中有一些异步函数可以为该特定项目提取图像,但是我遇到了一些交叉污染的问题,其中为一个ListItem提取图像会更改其他ListItems上的图像吗?不确定到底是怎么回事。

是否有办法“隔离”这些组件或重置状态,以使它们彼此独立?在每个的构造函数中,我都有

class ListItem extends Component {
    constructor(props) {
         super(props);
         this.state = {STATE STUFF HERE}
         this._functionThatPullsAsyncImages(); //this places an image url into the state
    }
    render(){RENDER STUFF HERE}

    _functionThatPullsAsyncImages = async() => {
        this.setState({coverImage : await getPlaylistImageURL(this.props.playlistId)}) 
    }

2 个答案:

答案 0 :(得分:0)

通常的做法是设置一个占位符图像,并触发一个异步调用以使用生命周期方法componentDidMount()而不是构造函数来加载该图像。像这样:

class ListItem extends Component {
    constructor(props) {
         super(props);
         this.state = {STATE STUFF HERE}
    }
    componentDidMount() {
        // 1. Set placeholder

        // 2. call async image loader
        this._functionThatPullsAsyncImages(); //this places an image url into the state
    }
    render(){RENDER STUFF HERE}

    _functionThatPullsAsyncImages = async() => {
        this.setState({coverImage : await getPlaylistImageURL(this.props.playlistId)}) 
    }

答案 1 :(得分:0)

您好,谢谢您的帮助,我想出了这一点。

我的结果实际上在异步函数getPlaylistImageURL()中被交叉污染了。我设置图像ID的变量之一未定义为const,这允许异步函数的不同实例覆盖它,并输入错误的ID。

一旦我解决了这个问题,一切都会解决。