- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 useMemo 钩子(Hook)返回并过滤一组项目。然后我有一个切换功能,可以切换一个项目是真还是假,然后将该项目发回 API(如果它是真或假)并将其添加到列表中。在使用 useReducer 钩子(Hook)的函数中,数组落后一步。例如,元素数组被返回,您可以切换它们是否在销售,如果您切换为 true,它们将被添加到 saleList 中,如果它们被切换为不销售,它们将被添加到 notSaleList。在函数中,saleList 的长度将返回 3,但实际上是 4,然后您删除一个 home 使其变为 3,但它会返回 4。有人知道为什么会这样吗?
const homesReducer = (state, action) => {
switch (action.type) {
case 'FETCH_INIT':
return {
...state,
isLoading: true,
isError: false,
};
case 'FETCH_SUCCESS':
//action.payload to object
const entities = action.payload.reduce((prev, next) => {
return { ...prev, [next.Id]: next };
}, {});
return {
...state,
isLoading: false,
isError: false,
homes: entities,
};
case 'FETCH_FAILURE':
return {
...state,
isLoading: false,
isError: true,
};
case 'TOGGLE_SALE_HOME_INIT':
return {
...state,
homes: {
...state.homes,
// ask Jenkins
[action.payload]: {
...state.homes[action.payload],
IsSaleHome: !state.homes[action.payload].IsSaleHome,
},
},
};
case 'TOGGLE_SALE_HOME_SUCCESS':
return {
...state,
};
case 'TOGGLE_SALE_HOME_FAILURE':
// TODO update back if failed
return {
...state,
homes: {
...state.homes,
// ask Jenkins
[action.payload]: {
...state.homes[action.payload],
IsSaleHome: !state.homes[action.payload].IsSaleHome,
},
},
};
default:
return { ...state };
}
};
const useOnDisplayApi = activeLotNumber => {
const [state, dispatch] = useReducer(homesReducer, {
isLoading: false,
isError: false,
homes: [],
saleHomes: [],
});
const homes = useMemo(() => {
return Object.keys(state.homes).map(id => {
return state.homes[id];
});
}, [state.homes]);
}
const saleHomes = useMemo(() => {
return homes.filter(home => {
return home.IsSaleHome;
});
}, [homes]);
const notSaleHomes = useMemo(() => {
return homes.filter(home => {
return !home.IsSaleHome && !home.IsSuggestedSaleHome;
});
}, [homes]);
const toggleSaleHome = async (home, undo = true) => {
dispatch({ type: 'TOGGLE_SALE_HOME_INIT', payload: home.Id });
try {
const didUpdate = await updateInventory(
activeLotNumber,
home.InventoryId,
{
InventoryId: home.InventoryId,
IsSaleHome: !home.IsSaleHome,
}
);
if (didUpdate == true) {
dispatch({ type: 'TOGGLE_SALE_HOME_SUCCESS' });
}
else {
dispatch({ type: 'TOGGLE_SALE_HOME_FAILURE', payload: home.Id });
}
} catch (error) {
setTimeout(() => {
dispatch({ type: 'TOGGLE_SALE_HOME_FAILURE' });
}, 600);
}
};
最佳答案
调度后的更新不会立即可用并且是异步的。因此,您的应用程序将经历另一个渲染周期以反射(reflect)更新。
您需要使用 useEffect
在更新后调用 api 而不是在初始渲染时调用它。
const initialRender = useRef(true);
useEffect(() => {
if(initialRender.current) {
initialRender.current = false;
} else {
try {
const didUpdate = await updateInventory(
activeLotNumber,
home.InventoryId,
{
InventoryId: home.InventoryId,
IsSaleHome: !home.IsSaleHome,
}
);
if (didUpdate == true) {
dispatch({ type: 'TOGGLE_SALE_HOME_SUCCESS' });
}
else {
dispatch({ type: 'TOGGLE_SALE_HOME_FAILURE', payload: home.Id });
}
} catch (error) {
setTimeout(() => {
dispatch({ type: 'TOGGLE_SALE_HOME_FAILURE' });
}, 600);
}
}
}, [home])
const toggleSaleHome = async (home, undo = true) => {
dispatch({ type: 'TOGGLE_SALE_HOME_INIT', payload: home.Id });
}
关于reactjs - 在 React 中使用 useMemo() 钩子(Hook)导致我的函数落后一步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55638982/
不知道是不是useMemo钩子(Hook)接收任何它内存的先前值作为其回调的任何参数? 最佳答案 Does a callback in useMemo receive any arguments? 不
你能有一个数组作为 useMemo 的依赖吗?钩? 我知道这会很好: const dep1 : string = '1' const thing = useMemo(()=>{ // stuff
我有以下 react 代码 const { useState, useMemo, Fragment } = React; function Rand() { return {Math.rand
我有这个用于搜索数据的useMemo import React, { useMemo, useState } from "react"; import "./SearchCharacters.css"
我仍然在思考 React hooks,并尝试根据不同的因素有条件地使用 useMemo。 我的 useMemo 部分是这样的 const headers = React.useMemo(
我对钩子(Hook)很陌生,所以在这里有一个问题: 我在 React 组件中具有类似的功能 const getSection = assignmentSectionId => { const
当组件死机时,如何通过 cat.destroy() 方法进行内存清理? const object = useMemo(() => { return new Cat() }, []) 最佳答案 清除
const handleTestDelete = (id: any) => { deleteTest(id).then(() => { queryClient.invalidate
在我的组件中,我使用 useMemo 运行和缓存一个有点昂贵的查询到浏览器运行时。到目前为止,它已经大大减少了后续渲染所需的时间。 然而,实际的第一次渲染仍然是一个问题。我一次渲染了我的组件的数千个实
我有一个简单的例子: import { useMemo, useState } from "react"; import "./styles.css"; const calc = (n) => (
我试图使用 react-useMemo 来防止组件重新渲染。但不幸的是,它似乎没有解决任何问题,我开始怀疑我是否做错了什么 我的组件看起来像这样 function RowVal(props) {
在类组件的情况下,有没有办法使用这个钩子(Hook)或 React API 的一些类似物? 我想知道,我应该在类组件的情况下使用一些第三方备忘录助手(例如 lodash memo , memoizeO
在 docs现声明如下: useMemo will only recompute the memoized value when one of the dependencies has changed
我正在使用 Hooks 构建一个 REACT 应用程序,现在在使用 useMemo() 和一些事件监听器时遇到问题。我已经在 CodeSandBox 上准备了一个更简单的演示来解决我的问题:这是链接
我可以在 useMemo 的第二个参数中使用 && 风格的安全导航或 lodash get 吗: useMemo(() => { return { ... } }, [state &&
我有以下简单组件: const Dashboard = () => { const [{ data, loading, hasError, errors }] = useApiCall(true)
我使用 TypeScript 4 和 React 17 我在自定义钩子(Hook)中有这段代码: const myValue = useMemo((): string[] => { if
我已经阅读了几篇关于何时优化 React 渲染的文章,但是,我仍然有一些疑问。 const RepairNoticeContainer = () => { const dispatch = u
做和做有什么区别 const value = useMemo(() => { ... }); 和 const value = useMemo(() => { ... }, []);
所以我只是掌握了 useMemo 和 useCallback 的要领,并尝试看看它们是如何工作的。在这种情况下,我想做的是在父级发送相同对象时不渲染子级。 这是我的父组件: const Parent
我是一名优秀的程序员,十分优秀!