reactjs - useEffect 作为具有多个依赖项的 componentDidUpdate
问题描述
如何有条件地更新我的状态?
如果早餐不是空的,我想更新我的早餐状态,
如果午餐不是空的,我想更新我的午餐状态,
如果 diner 不是空的,我想更新我的 Diner 状态,
如果零食不为空,我想更新我的零食状态,
import React, { useState, useEffect } from 'react';
import PropTypes from 'prop-types';
import { connect } from 'react-redux';
import { createStructuredSelector } from 'reselect';
import { state_breakfast, state_lunch, state_diner, state_snack } from '../../../redux/selectors/meal';
import Card from './Card';
import Buttons from './Buttons';
import isEmpty from '../../common/utils/isEmpty';
const Meals = ({ breakfast, lunch, diner, snack }) => {
const [state, setState] = useState({ Breakfast: false, Lunch: false, Diner: false, Snack: false });
const { Breakfast, Lunch, Diner, Snack } = state;
useEffect(() => {
if(!isEmpty(breakfast)) setState({ ...state, Breakfast: true });
},[breakfast]);
// useEffect(() => {
// if(!isEmpty(breakfast)) setState({ ...state, Breakfast: true });
// if(!isEmpty(lunch)) setState({ ...state, Lunch: true });
// if(!isEmpty(diner)) setState({ ...state, Diner: true });
// },[breakfast, lunch, diner, snack]);
return(
....
)
const mapStateToProps = createStructuredSelector({
breakfast: state_breakfast,
lunch: state_lunch,
diner: state_diner,
snack: state_snack
});
export default connect(mapStateToProps, null)(Meals);
问题是,它的更新只有 1 个状态
欢迎任何帮助,谢谢
解决方案
您有 2 个(或更多)选项来实现这一目标:
选项1
单独处理每个状态:
const Meals = ({ breakfast, lunch, diner, snack }) => {
const [breakfast, setBreakfast] = useState(breakfast);
const [lunch, setLunch] = useState(lunch);
const [dinner, setDinner] = useState(diner);
const [snack, setSnack] = useState(snack);
useEffect(() => {
if (breakfast) setBreakfast(true);
if (lunch) setLunch(true);
if (dinner) setDinner(true);
if (snack) setSnack(true);
}, [breakfast, lunch, dinner, snack])
选项 2
function reducer(state, action) {
return { ...state, ...action };
}
const Meals = ({ breakfast, lunch, dinner, snack }) => {
const [state, setState] = useReducer(reducer, { breakfast, lunch, diner, snack });
useEffect(() => {
setState({ breakfast, lunch, dinner, snack });
}, [breakfast, lunch, dinner, snack])
我建议使用useReducer
但使用传递更改的函数来处理它。
推荐阅读
- scala - Gatling:转换响应并将其写入 JSON 文件
- javascript - PrimeNG 的“onClose”日历事件在跳出字段时不会触发?
- c# - 如何使用 TensorFlow Keras API 训练 dropout 概率?
- reactjs - 如何在无需注销/登录的情况下更新我的页面
- angular - 路由 URL 包含一个片段 (#)
- php - 在android中将大文件上传到服务器
- ios - 如何自定义 AWS Amplify iOS 身份验证警报?
- mongodb - How to connect to Mongodb in Apache Airflow?
- c# - 将 AutoSuggestBox 添加到汉堡导航的正确方法?
- java - 找不到适合 jdbc:derby:myDBtest 的驱动程序