反应-永久违反:超出最大更新深度

时间:2020-04-28 07:42:26

标签: reactjs react-native react-state-management

我具有从另一个类设置状态的功能,但出现以下错误

已超过最大更新深度。当组件重复调用componentWillUpdate或componentDidUpdate内部的setState时,可能会发生这种情况。 React限制了嵌套更新的数量,以防止无限循环。

这是我的代码,

  constructor(props) {
    super(props)
    this.state = { loading: true, showAction: false }
    setTimeout(() => {
      StatusBar.setBackgroundColor(primary)
    }, 100)
  }

  async componentWillMount() {
    await Font.loadAsync({
      Roboto: require("native-base/Fonts/Roboto.ttf"),
      Roboto_medium: require("native-base/Fonts/Roboto_medium.ttf"),
      Ionicons: require("@expo/vector-icons/build/vendor/react-native-vector-icons/Fonts/Ionicons.ttf"),
    });
    this.setState({ loading: false });
  }

  setShowAction = (isShowAction) => {
    console.log(isShowAction)
    this.setState({
      showAction: isShowAction
    })
  }

...

<ChatListScreen onAction={(isShowAction) => this.setShowAction(isShowAction)}/>

...

const ChatListScreen = ({ onAction }) => {

    return (
        <ChatList onAction={(isShowAction) => onAction(isShowAction)}/>
    )
}

...

const ChatList = ({ onAction }) => {
    const [selectMode, setSelectMode] = useState(false)
    const chatListDummy = []
    const [selectedItem, setSelectedItem] = useState([])
    {selectMode ? onAction(true) : onAction(false)}
    return (
        <FlatList
                data= {chatListDummy}
                keyExtractor= {chat => chat.id}
                renderItem= {({item}) => {
                }}/>
    )
}

export default ChatList

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:3)

查看我的解决方案

const ChatListScreen = ({ onAction }) => {

   return (
       <ChatList onAction={(isShowAction) => onAction(isShowAction)}/>
   )
}
const ChatList = ({ onAction }) => {
   const [selectMode, setSelectMode] = useState(false)
   const [selectedItem, setSelectedItem] = useState([])
   //i dont know where are you using this actally you most use this in a lifesycle or a function
   // {selectMode ? onAction(true) : onAction(false)}
function onClick(){
   selectMode ? onAction(true) : onAction(false)

}
//or a lifecycle
useEffect(()=>{
   selectMode ? onAction(true) : onAction(false)

},[])
return (<div onClick ={onClick} >{"your content"}</div>)

答案 1 :(得分:1)

尽量避免将匿名函数作为道具传递给React组件。这是因为React总是会重新渲染您的组件,因为它无法将其状态与上一个组件的状态进行比较。

话虽如此,在某些情况下不可避免地会传递匿名函数。在这种情况下,切勿在匿名函数内更新状态。这是您方案中的主要问题,正在发生的事情:

  1. 您将匿名函数作为道具传递给组件。
  2. 组件接收到此功能后,无法将其与以前的状态进行比较,因此重新呈现了组件。
  3. 在您的匿名函数中,您正在更新状态。更新状态将迫使React再次重新渲染组件。
    this.setState({
      showAction: isShowAction
    }) //this portion is mainly responsible for the error
  1. 因此,此循环一直持续到一个阈值,直到React引发错误Maximum update depth exceeded.
相关问题