当用户选择产品类型时,我正在下载包含属于该特定类型产品的文件。
这是我的代码:
const [productType, setProductType] = useState(null);
useEffect(() => {
if (productType!= null) {
exportProducts();
}
}, productType);
我的下拉列表包含以下类型:
<MyDropdownComponent
value={productType}
onChange={e => setProductType(e.target.value)}
width={200}
/>
即使我从下拉菜单中选择两次相同的值来再次下载文件,例如,我选择“出售产品”,然后下载文件,我还是立即从下拉菜单中选择相同的东西(“出售产品”)我想要再次下载文件,如何实现?
我知道钩子只有在值更改/与先前值不同时才起作用,因为useEffect中的代码将再次呈现...
所以我的问题是,即使第二个参数的值相同,如何在useEffect中调用代码?
答案 0 :(得分:1)
您可以这样做:
const [productType, setProductType] = useState(null);
const [productTypeChanges, setProductTypeChanges] = useState(0);
useEffect(() => {
if (productType !== null) {
exportProducts();
}
}, [productTypeChanges]);
JSX:
<MyDropdownComponent
value={productType}
onChange={e => {
setProductTypeChanges(productTypeChanges + 1);
setProductType(e.target.value);
}}
width={200}
/>
如果要确保正在调用render函数,则需要更改props或state。由于您的setProductType
用相同的值调用,因此不会强制渲染。也许存在一个更优雅的解决方案,但这是解决此问题的一种方法。
您当然还需要确保当用户再次选择相同的值时将调用onChange
。
或者,您可以在exportProducts
中运行onChange
,而根本不使用useEffect
。但是,由于该问题明确提及了useEffect
,因此从技术上讲,这本身并不是一个正确的答案。
答案 1 :(得分:1)
我认为您无需在此用例中使用useEffect
const [productType, setProductType] = useState(null);
const handleChange = e => {
e.target.value !== null && exportProducts();
setProductType(e.target.value)
}
return (
<MyDropdownComponent
value={productType}
onChange={handleChange}
width={200}
/>
)