当前位置: 首页 > 知识库问答 >
问题:

反应状态不刷新值

沈宇定
2023-03-14

我现在正在学习React,但在重新渲染组件时遇到了问题。应用程序。js代码:

function App() {
const [expenses, setExpenses] = useState(INITIAL_EXPENSES);
const addNewExpenseHandler = (expense) => {
    setExpenses((prevState) => {
        return [expense, ...prevState];
    }, changeYearHandler(filteredYear));
};

const filterExpenses = (expenses, year) => {
    const newFilteredExpenses = expenses.filter((expense) => {
        if (String(expense.date.getFullYear()) === year) {
            return expense;
        }
    });
    return newFilteredExpenses;
};
const [filteredYear, setFilteredYear] = useState('2019');
const [filteredExpenses, setFilteredExpenses] = useState(
    filterExpenses(expenses, filteredYear)
);
const changeYearHandler = (value) => {
    setFilteredYear(
        value,
        setFilteredExpenses(() => {
            const newValue = filterExpenses(expenses, value);
            return newValue;
        })
    );
};
return (
    <>
        <NewExpense onAddNewExpense={addNewExpenseHandler} />
        <ExpenseFilter expenses={expenses} />
        <ShowExpenses
            onChangeYear={changeYearHandler}
            data={filteredExpenses}
        />
    </>
);
}

export default App;

问题是filtered开支不是最新的。它总是弱智,这是以前的状态。我试图调用一个ChangeYearHandlersetFilteredDaysetFilteredExpense的回调中,但是它仍然不起作用,我不知道为什么。

共有1个答案

裴心思
2023-03-14
const filteredExpenses = useMemo(() => {
    return expenses.filter((expense) => {
        if (String(expense.date.getFullYear()) === filteredYear) {
            return expense;
        }
    });
}, [expenses, filteredYear]);

依赖项数组将确保无论何时费用过滤数据项发生更改,那么过滤数据项都将重新计算并返回一个新的过滤数组(随后缓存)。

 类似资料:
  • 问题内容: 所以我有这个: newDealersDeckTotal只是一个数字数组,例如,但是没有给出正确的总数,但是呢?我什至设置了超时延迟,以查看是否可以解决问题。任何明显的还是我应该发布更多代码? 问题答案: 通常是异步的,这意味着在您处于状态时,它尚未更新。尝试将日志放入方法的回调中。状态更改完成后执行:

  • 我使用“userdefaults”存储用户重新加载页面的日期时间。但是,我发现即使时间过了,它也不会刷新 因为我正在测试,所以我用“分钟”来简化我的测试。我希望当每分钟发生变化时,上面的代码会更新我的UserDefaults。 我发现我浏览到另一个页面,回到HomeView。时间戳根本没有更新。我打印了lastLaunchDate,它也没有更新。

  • 问题内容: 在这里,我尝试设置为’hello’,然后打印它,但是状态似乎为空。当我刚刚使用更新状态时怎么办?设置为全局变量。 问题答案: 从reactjs文档中: 不会立即变异,但会创建待处理的状态转换。调用此方法后进行访问可能会返回现有值。 https://facebook.github.io/react/docs/component- api.html 您可以做的是将状态更新后传递给回调函数:

  • 2.19 刷新状态查询 2.19.1 描述 返回刷新进度 2.19.2 请求地址 地址: https://api.bokecs.com/queryrefresh/{package_id} 2.19.3 请求方式 GET 2.19.4 请求参数 参数名称 是否必须 参数描述 package_id 是 刷新接口中code为200时返回的message 2.19.5 请求格式 json 2.19.6 举

  • 有一个案例我很困惑。 我有一个对象redux状态:{show:true,creative:{name:'a',tags:[t1,t2,t3]}。此对象已通过“react redux”的“connect”功能映射到道具。 当我改变属性“显示”或“creative.name”时,它确实会触发重新渲染。但是如果我将t0追加到"creative.tags",它就不会运行re-渲染。 我必须分配一个新变量来

  • 我正在尝试新的hooks功能,并坚持认为我的状态没有更新。 实际上,状态已更新(我可以在console.log中看到更新的值,并且我的组件会重新运行useEffect),但是useEffect方法使用我的旧状态,并仅将签名保存给第一个用户,而活动用户在状态中确实发生了更改。 我想过添加useCallback,并将我的方法移动到use效果或组件本身,但我可以设法让它工作。 状态: 这是我的效果: 这