【发布时间】:2019-03-18 12:30:45
【问题描述】:
我有下面的代码,我想在其中创建标签列表。在这个例子中,我在setAllTags() 中获取标签列表,然后在setAvailableTags() 中获取一些可用标签。
然后我遇到的问题是,当setAvailableTags() 运行时,它将删除在setAllTags() 中获取的标签。当setAvailableTags()设置它的状态时,我在setAllTags()中设置的状态似乎没有使用。
知道我能做些什么来解决这个问题吗?
https://codesandbox.io/s/rj40lz6554
import React, { useState, useEffect } from "react";
import ReactDOM from "react-dom";
const Search = () => {
const [tags, setTags] = useState({
all: [],
available: []
});
const setAllTags = () => {
const all = ["tag 1", "tag 2", "tag 3"];
const newValue = {
...tags,
all
};
console.log("setting all tags to ", newValue);
setTags(newValue);
};
const setAvailableTags = () => {
const available = ["tag 1", "tag 2"];
const newValue = {
...tags,
available
};
console.log("setting available tags to", newValue);
setTags(newValue);
};
useEffect(setAllTags, []);
useEffect(setAvailableTags, []);
return (
<div>
<div>
<select placeholder="Tags">
{tags.all.map((tag, i) => (
<option key={tag + i} value={tag}>
{tag}
</option>
))}
</select>
</div>
</div>
);
};
const App = () => {
return (
<div>
<h1>Hello React!</h1>
<Search />
</div>
);
};
ReactDOM.render(<App />, document.getElementById("app"));
控制台记录了
setting all tags to Object {all: Array[3], available: Array[0]}
setting available tags to Object {all: Array[0], available: Array[2]}
【问题讨论】:
-
你不应该在 useEffect 中设置状态。
-
在
useEffect中设置状态是完全可以的。 -
没有警戒条件的情况下不会。它将永远运行。
标签: javascript reactjs react-hooks