标签: use-effect

useCallBack React-hooks/exhaustive-deps 警告

这是我在 React js 中的代码的一部分:

export default function Registration() {
    const [email, setEmail] = useState(null);
    const [password, setPassword] = useState(null);
    const [passwordRepeat, setPasswordRepeat] = useState(null);
    const [isFieldsOK, setFieldsOK] = useState(false);

    useEffect(() => {
        if (checkFieldsOK()) {
            setFieldsOK(true);
        } else {
            setFieldsOK(false);
        }
    }, [checkFieldsOK])

    const checkFieldsOK = () => {
        return (isEmail(email) && isValidPassword(password) && passwordRepeat === password);
    }
}
Run Code Online (Sandbox Code Playgroud)

我有 isFieldsOK 状态,它告诉我我的字段是否有效,并且我希望它“侦听”注册功能中的每个更改。运行此命令后,我收到此警告:

The 'checkFieldsOK' function makes the dependencies of useEffect Hook (at line 34) change on every render. Move it …
Run Code Online (Sandbox Code Playgroud)

reactjs react-hooks usecallback use-effect

5
推荐指数
1
解决办法
5223
查看次数

使用 happy ESLint 运行一次 useEffect

这是一个 React 风格的问题。

TL;DRsetReact 的useState. useEffect如果该函数“更改”了每次渲染,那么在效果仅运行一次的情况下,在 中使用它的最佳方法是什么?

说明我们有一个 useEffect 需要运行一次(它获取 Firebase 数据),然后将该数据设置为应用程序状态。

这是一个简化的示例。我们正在使用Little-state-machine,它updateProfileData是更新 JSON 状态的“配置文件”部分的操作。


const MyComponent = () => {
    const { actions, state } = useStateMachine({updateProfileData, updateLoginData});
    useEffect(() => {
        const get_data_async = () => {
            const response = await get_firebase_data();
            actions.updateProfileData( {user: response.user} );
        };
        get_data_async();
    }, []);

    return (
        <p>Hello, world!</p>
    );
}
Run Code Online (Sandbox Code Playgroud)

然而,ESLint 不喜欢这样: React Hook useEffect has a missing dependency: 'actions'. Either include …

javascript reactjs react-hooks use-effect

5
推荐指数
1
解决办法
1502
查看次数

如何在 useeffect 中使用新鲜状态,但仅在卸载时执行清理

AFAIK,在 React 函数组件中,必须使用useEffect如下componentWillUnmount功能:

useEffect(()=>{
  return console.log("component unmounting");
},[])
Run Code Online (Sandbox Code Playgroud)

我正在制作一个表单页面,并希望在用户退出页面时提交进度。所以我正在考虑在清理过程中提交。

但是,如果我不将formData状态放入依赖项数组中,则状态将在清理过程中过时。
如果我确实formData将其放入依赖项数组中,则每次formData.

如何保持状态新鲜,但仅在“真正卸载”中运行清理?

const [formData, setFormData] = useState({
  input1: 'input1 default',
  input2: 'input2 default',
}); // track the form data


useEffect(()=>{
  return () => {
    axios.post(myFormSubmitURL, formData);
  }
}, []); // this will submit the stale data

useEffect(()=>{
  return () => {
    axios.post(myFormSubmitURL, formData);
  }
}, [formData]); // this will submit the data every time it changes
Run Code Online (Sandbox Code Playgroud)

post reactjs use-effect use-state

5
推荐指数
1
解决办法
638
查看次数

react-query: 是否有回调无论 getQuery 是否被缓存都会触发?

我想在获取数据后执行一些副作用,例如 setState 和更新上下文。但是,当数据在缓存中时,onSuccess 不会执行。另外 useEffect 不起作用,因为如果数据被缓存,它不会从未定义的数据更改为真实数据。因此它也不会被触发。这样做的最佳方法是什么?谢谢

reactjs use-effect react-query

5
推荐指数
1
解决办法
4792
查看次数

是否可以将 useEffect 放在 if 语句中?

伙计们,我一直在开发我的登陆和仪表板页面。

所以页面的工作流程是这样的:用户进入登陆页面,他可以在其中选择插入表单位置,或按按钮接收所有位置。现在,在后端,我创建了两个 API,第一个用于获取所有位置,第二个是我添加的:location位置req.body.param,然后根据该参数过滤位置。邮递员一切正常。

现在因为我有两种用户获取位置的方法(全部或他想要的一些),我认为我useEffect在 if 语句中放置了两个 s ,如下所示:

const filter = props.location.data;
if (filter) {
    useEffect(() => {
      const fetchFiltered = async () => {
        const res = await ArticleService.filterByName(filter);
        setContent(res.data);
      };

      fetchFiltered();
    }, []);
  } else {
    useEffect(() => {
      const fetchPosts = async () => {
        const res = await ArticleService.articles();
        setContent(res.data);
      };

      fetchPosts();
    }, []);
  }
Run Code Online (Sandbox Code Playgroud)

所以我背后的逻辑是,如果有filter内部的props.locationexecute me useEffect,它从谁那里获取数据ArticleService,然后在api url内发送过滤器。如果没有,filter只需检索所有数据,并将Content 设置为res.data …

javascript reactjs use-effect

5
推荐指数
1
解决办法
6275
查看次数

React 延迟加载 useEffect

我在从useEffect获取clientWidth时遇到问题

有一个lazyLoad可以加载用户页面。

import {Suspense, lazy} from 'react';

const UsersContainer = lazy (() => import ('./ users / users-container'));

const Index = (props) => {
    return (
        <Suspense fallback = {<div id = {'loading'} />}>
            <UsersContainer />
        </Suspense>
    )
}

export default Index;
Run Code Online (Sandbox Code Playgroud)

UsersContainer有一个子组件dataTooltip,如果不适合该块,它将显示完整的用户名。

import React, {useEffect, useRef} from 'react';

import '../common.scss';

const DataTooltip = ({title, ... props}) => {
    let ref = useRef ();

    useEffect (() => {
        if (ref.current.scrollWidth> ref.current.clientWidth) …
Run Code Online (Sandbox Code Playgroud)

lazy-loading reactjs react-hooks use-effect

5
推荐指数
1
解决办法
8665
查看次数

在 useEffect 的 cleanup/return 方法中访问 useState 变量

我有一个像这样的领域

const SimpleReactComponent = (props) => {
  const [title, setTitle] = useState('DEFAULT')

  useEffect(() => {
    return () => {
      // unmount 
      console.log(`[${title}] while unmounting`)
    }
  }, [])
  return <TextInput value={title} onChangeText={title => setTitle(title)}></TextInput>
}
Run Code Online (Sandbox Code Playgroud)

当我修改该title字段并离开该组件时,它仍然打印以下内容

[DEFAULT] while unmounting

Run Code Online (Sandbox Code Playgroud)

虽然我期待新修改的值而不是DEFAULT.

如何在组件卸载时捕获更改?

reactjs react-native use-effect use-state

5
推荐指数
1
解决办法
2152
查看次数

在 useEffect 挂钩中使用对象属性而不是对象作为依赖项是不好的做法吗?

我在我的功能组件中使用以下代码。我希望该组件仅在更改时重新渲染game._id。但 React 不断向我发出警告:

React Hook useEffect 缺少依赖项:“游戏”。包含它或删除依赖项数组

这是一种危险的做法,还是如果我明确希望它依赖于给定的属性,这是合理的?

  const [game, setGame] = useState({});

  useEffect(() => {
    return () => {
      if (game._id !== undefined) {
       // Do stuff with game
      }
    };
  }, [socket, user, game._id]);
Run Code Online (Sandbox Code Playgroud)

我不想使用游戏作为依赖项,因为这会使我的组件重新渲染太多。

reactjs react-hooks use-effect

5
推荐指数
1
解决办法
1764
查看次数

使用计算变量与 useState/useEffect 的后果

如果我有一个变量,其值可以根据另一个属性的值完全派生,那么初始化计算变量与使用useState/的组合useEffect来跟踪变量是否有任何后果/陷阱?让我用一个人为的例子来说明:

/**
 * ex paymentAmounts: [100, 300, 400]
 */
const Option1 = ({paymentAmounts}) => {
  const [average, setAverage] = useState(paymentAmounts.reduce((acc, curr) => curr + acc, 0) / paymentAmounts.length)

  useEffect(() => {
    setAverage(paymentAmounts.reduce((acc, curr) => curr + acc, 0) / paymentAmounts.length)
  }, [paymentAmounts])

  return (
    <div>
      Average: {average}
    </div>
  )
}
Run Code Online (Sandbox Code Playgroud)

或者更简单地说

/**
 * ex paymentAmounts: [100, 300, 400]
 */
const Option2 = ({paymentAmounts}) => {
  const average = paymentAmounts.reduce((acc, curr) => curr + acc, 0) / …
Run Code Online (Sandbox Code Playgroud)

javascript reactjs use-effect use-state

5
推荐指数
1
解决办法
1357
查看次数

使用 Promise 清理 useEffect 的正确方法

我有useEffect一个回调函数,可以从多个 API 中获取一些数据。为此,我正在使用Promise并且我的代码如下所示:

useEffect(() => {
   const fetchAllData = async () => {
      const resourceOne = new Promise((resolve) => {
         // fetching data from resource one and changing some states
      })
      const resourceTwo = new Promise((resolve) => {
         // fetching data from resource two and changing some states
      })
      const resourceThree = new Promise((resolve) => {
         // fetching data from resource three and changing some states
      })

      await Promise.all([resourceOne, resourceTwo, resourceThree])
      .then(() => {
         // changing …
Run Code Online (Sandbox Code Playgroud)

promise reactjs use-effect

5
推荐指数
1
解决办法
3923
查看次数