【发布时间】:2020-11-25 09:19:22
【问题描述】:
我有一个在更改时触发的事件。此事件检查哪个过滤器已更改,然后相应地更新状态。
如果我不使用 react hooks,我会选择这样的 -
const target = e.target;
const value = e.type === "checkbox" ? target.checked : target.value;
const name = e.target.name;
this.setState({ [name]: value });
如您所见,我可以使用[name] 更新状态名称,但由于我使用的是反应钩子,因此无法使用上述方法。相反,我得到了这个 -
const [type, setType] = useState("all");
const [capacity, setCapacity] = useState(1);
const [price, setPrice] = useState(0);
const [minPrice, setMinPrice] = useState(0);
const [maxPrice, setMaxPrice] = useState(0);
const [minSize, setMinSize] = useState(0);
const [maxSize, setMaxSize] = useState(0);
const handleChange = (e) => {
const target = e.target;
const value = e.type === "checkbox" ? target.checked : target.value;
const name = e.target.name;
switch (name) {
case "type":
setType(value);
break;
case "capacity":
setCapacity(value);
break;
case "price":
setPrice(value);
break;
case "minPrice":
setMinPrice(value);
break;
case "maxPrice":
setMaxPrice(value);
break;
case "minSize":
setMinSize(value);
break;
case "maxSize":
setMaxSize(value);
break;
default:
return;
}
};
您在上面看到的内容由于某种原因不起作用。当我触发过滤器时,它会进入我已经测试过的情况,但状态似乎没有更新。名称和值也已记录,它们也很好。我不确定是什么原因造成的,而且我只是编程新手,因此我们将不胜感激!
*** 重申一下值和名称都有效,switch 语句也是如此。只是状态没有更新***
【问题讨论】:
-
你能粘贴完整的代码或显示问题的codeandbox小项目吗?
-
你如何验证/确认状态没有被更新?
-
能否请您粘贴完整的代码,并告诉我们您如何验证它是否正在更新状态。
-
我已经记录了它,但是因为我知道它不是即时的,所以我还设置了超时以在几秒钟后检查状态。这是完整的代码文件:gist.github.com/MelissaAstbury/cf9a60096a67a3361b69aadfdb4c34b8 ...在第 105 行检查了@Apostolos
-
只需使用生命周期方法在更新时记录状态,即
componentDidUpdate用于基于类的组件,useEffect用于功能组件。你也可以使用 react-dev-tools 浏览器扩展来做一些状态监听。我怀疑您已将“当前”状态包含在 setTimeout 回调中。请更新您的问题以包含您正在运行的实际代码,以便我们查看相同代码。
标签: javascript reactjs react-hooks