Javascript 在静态方法中设置状态

Javascript 在静态方法中设置状态,javascript,react-native,setstate,Javascript,React Native,Setstate,我想使用setState方法从另一个组件设置一个组件的状态,因为它似乎涉及较少的编码,但是我知道我不能在静态方法中使用this关键字,这给我带来了一个问题。我想知道这个问题的另一个解决办法。非常感谢你的帮助 第一部分 class First extends Component { filterByLocation(loc) { const filteredData = this.state.passedInfo.filter(({area}) => area ==

我想使用setState方法从另一个组件设置一个组件的状态,因为它似乎涉及较少的编码,但是我知道我不能在静态方法中使用this关键字,这给我带来了一个问题。我想知道这个问题的另一个解决办法。非常感谢你的帮助

第一部分

class First extends Component {

    filterByLocation(loc) {
        const filteredData = this.state.passedInfo.filter(({area}) => area === loc);
        this.setState({members: filteredData})
    }

}
第二部分

class Second extend Component {

    renderSuggestion() {

        <TouchableOpacity 
            onPress = {()=> this.setState({location}, () => {
                First.filterByLocation(this.state.location);
            })}>

            <Text> {"Click Me"}</Text>
        </TouchableOpacity>
    }
}
class第二扩展组件{
renderSuggestion(){
this.setState({location},()=>{
首先,filterByLocation(this.state.location);
})}>
{“点击我”}
}
}

为什么不将整个对象传递给您的方法,如:

    <TouchableOpacity 
        onPress = {()=> this.setState({location}, () => {
            Home.filterByLocation(this, this.state.location);
        })}>

        <Text> {"Click Me"}</Text>
    </TouchableOpacity>

当然,这不是一个好的做法,它应该解决问题,但不应该过度使用

我最初认为这是一个评论,但实际上,这是一个答案:


一个组件不应该设置另一个组件的状态,即使它可以访问组件实例(从而访问
setState
)。如果没有对组件实例的访问,它当然不能这样做

相反:

  • 并将其作为道具传递给组件,或
  • 使用并再次将状态作为道具传递(注意:虽然出现了提供类似功能的项目,但并不完全确定React Native是否支持门户),或者
  • 使用(在React Native中使用)

…或者可能是其他任何事情。在您的特定场景中,提升状态似乎是正确的。

一个组件不应设置另一个组件的状态。相反,[lift state up]()并将其作为道具传递给组件,或者使用并再次将状态作为道具传递,或者使用,或者……分别传递:您的两个代码块如何关联?第一个不使用
Second
,第二个不使用
first
Home
应该是
First
吗?很抱歉我赶了一会儿,Home应该是First。你的回答很好,但是组件没有层次结构。第一个和第二个是完全独立的。@Syed.bcc-当事物不在层次结构中时,上面的第二个(门户)和第三个(上下文)要点都可以正常工作。它与react native一起工作吗?我看到它在谈论DOM@Syed.bcc-根据,您可以将上下文与React Native一起使用。A出现了三个提供门户类功能的项目(表明实际的门户可能不受支持,尽管您可能会尝试看看这是否真的是真的)。谢谢@Crowder,所有这些都非常有用。我甚至不知道这样的功能在反应中是可能的
    filterByLocation(context, loc) {
        const filteredData = context.state.passedInfo.filter(({area}) => area === loc);
        context.setState({members: filteredData})
    }