javascript - 在react-native功能组件中哪里实现初始化代码

标签 javascript function react-native initialization

我遵循博览会项目创建向导给出的功能模式,并且我有一个如下所示的组件:

Search.js

export default function Search() {
   const [searchResults, setSearchResults] = React.useState(buildContentViews(contents));

   return (
      <View style={styles.container}>
         <ScrollView contentContainerStyle={styles.contentContainer}>
            <View style={styles.statusLine}>
               <Text style={styles.statusLineText}>{(pageInfo.numResults || 0) + ' Treffer'}</Text>
            </View>
            {searchResults}
         </ScrollView>
      </View>
   );
}

现在我有一些后端 REST 服务的非 react native 实现,它将定期更新搜索结果。因此我需要做类似的事情:

export default function Search() {
   const [searchResults, setSearchResults] = React.useState(buildContentViews(contents));

   client.events.on('searchResults', (results) => setSearchResults(results));

   return (
      <View style={styles.container}>
         <ScrollView contentContainerStyle={styles.contentContainer}>
            <View style={styles.statusLine}>
               <Text style={styles.statusLineText}>{(pageInfo.numResults || 0) + ' Treffer'}</Text>
            </View>
            {searchResults}
         </ScrollView>
      </View>
   );
}

但是,我很快就收到建立了太多事件监听器的错误,这可能是因为每次(重新)渲染组件时(或者换句话说,每当更新组件时)都会运行上述代码。

那么在这种情况下我如何正确注册事件监听器和/或取消注册事件监听器?

最佳答案

useEffect 钩子(Hook)是你的 friend !

这就是我处理注册/取消注册在屏幕之间移动的 react-navigation 事件的方式(我不知道你的客户端代码是如何工作的,这只是一个例子)

  useEffect(() => {
    const onFocus = () => {
      // here I do something when the screen gets focused
    }
    // this is how you handle the registration to the event
    const focusListener = navigation.addListener('didFocus', onFocus)

    // and this is how to handle deregistration!
    return () => focusListener.remove()

  }, []) // empty array of dependencies
  1. useEffect Hook 的主体中,您可以定义操作;
  2. return 函数用于清理效果,是删除事件监听器的完美位置;
  3. 空依赖数组确保此代码将仅执行一次(在第一次渲染之后),不再执行!不再重新分配!定义事件监听器的完美方式!

关于javascript - 在react-native功能组件中哪里实现初始化代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60853301/

相关文章:

ios - 如何在 React Native 中桥接 SceneKit?

javascript - 使用 JavaScript 将 url 转换为文件对象

php - $this->request->is ('put' )) 方法在 CakePHP 中做什么?

python - 为什么这个 python 表达式参数在调用时没有扩展?

java - 设置传递给函数的数组变量

swift - 在react-native和swift之间共享cookie

javascript - 如何防止 react native 中的 setInterval 阻塞正在运行的动画?

javascript - 创建均值堆栈的种子项目

javascript - 如何使用 jquery 按月和年对日期进行分组?

javascript - 如何在不点击鼠标的情况下触发 'object:selected'?