首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将useState的值传递给BackHandler.addEventListener

如何将useState的值传递给BackHandler.addEventListener
EN

Stack Overflow用户
提问于 2019-09-14 22:48:40
回答 1查看 2.9K关注 0票数 4

我正在使用React Hooks,当我为android背压处理程序创建事件侦听器时,回调函数处理程序中的状态为空!

在类组件中,它工作得很好!

代码语言:javascript
复制
'use strict';

import React, { useState, useEffect } from 'react';
import { BackHandler } from 'react-native';
import TextInput from '../../../../components/TextInput';

export default function Foo() {
  const [comment, setComment] = useState('');

  useEffect(() => {
    const handler = BackHandler.addEventListener(
      'hardwareBackPress',
      handleValidateClose
    );
    return () => handler.remove();
  }, []);

  const handleValidateClose = () => {
    /* Here is empty */
    console.log(comment);
  };

  return <TextInput onChangeText={setComment} value={comment} />;
}

该值应为更改后的useState

EN

回答 1

Stack Overflow用户

发布于 2019-09-15 00:14:03

handleValidateClose应该在你的依赖数组上。

您可以在useEffect之外使用您的函数,但应该与useCallback一起使用。

代码语言:javascript
复制
 const handleValidateClose = useCallback(() => {
    console.log(comment);
    return true;
  }, [comment]);

  useEffect(() => {
    const handler = BackHandler.addEventListener(
      'hardwareBackPress',
      handleValidateClose,
    );

    return () => handler.remove();
  }, [handleValidateClose]);

您还可以将定义移动到useEffect内部,并添加注释作为依赖项。

代码语言:javascript
复制
useEffect(() => {
    const handleValidateClose = () => {
      console.log(comment);
      return true;
    };

    const handler = BackHandler.addEventListener(
      'hardwareBackPress',
      handleValidateClose,
    );

    return () => handler.remove();
  }, [comment]);

要清理这些内容,请创建一个useBackHandler

代码语言:javascript
复制
export default function useBackHandler(handler) {
  useEffect(() => {
    BackHandler.addEventListener('hardwareBackPress', handler);

    return () => {
      BackHandler.removeEventListener('hardwareBackPress', handler);
    };
  });
}

并像这样使用它:

代码语言:javascript
复制
const handleValidateClose = () => {
    console.log(comment);
    return true;
  };

  useBackHandler(handleValidateClose);

请将您的项目配置为使用eslint-plugin-react-hooks。这是一个插件可以帮助你的common pitfalls

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57936587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档