这是我在 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) 这是一个 React 风格的问题。
TL;DR从setReact 的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 …
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) 我想在获取数据后执行一些副作用,例如 setState 和更新上下文。但是,当数据在缓存中时,onSuccess 不会执行。另外 useEffect 不起作用,因为如果数据被缓存,它不会从未定义的数据更改为真实数据。因此它也不会被触发。这样做的最佳方法是什么?谢谢
伙计们,我一直在开发我的登陆和仪表板页面。
所以页面的工作流程是这样的:用户进入登陆页面,他可以在其中选择插入表单位置,或按按钮接收所有位置。现在,在后端,我创建了两个 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 …
我在从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) 我有一个像这样的领域
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.
如何在组件卸载时捕获更改?
我在我的功能组件中使用以下代码。我希望该组件仅在更改时重新渲染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)
我不想使用游戏作为依赖项,因为这会使我的组件重新渲染太多。
如果我有一个变量,其值可以根据另一个属性的值完全派生,那么初始化计算变量与使用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) 我有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) reactjs ×10
use-effect ×10
react-hooks ×4
javascript ×3
use-state ×3
lazy-loading ×1
post ×1
promise ×1
react-native ×1
react-query ×1
usecallback ×1