javascript - 在创建新实例之前对值进行反应过滤
问题描述
我有一个这样的 React 组件:
export default function RenderEditor(props) {
const {annotation, onChange, onSubmit, categories, usedCategories} = props;
const [selectedValue, setSelectedValue] = React.useState(categories[0].categoryName)
const displayedCategories = categories.filter(category => !usedCategories.includes(category.categoryName))
//this should be fixed so it also sets the category correctly
React.useEffect(() => {
document.addEventListener("keydown",(e) => handleKeyPress(e, setSelectedValue, onChange, categories, annotation, onSubmit, selectedValue))
}, [])
//this is used to filter the categories so only the availible categories are displayed
return (
<div style={{width: '500px', height: '350px', witdth: '50%', margin: 'auto 0'}}>
<p>Editor example</p>
<ValueSelection
setSelectedValue={setSelectedValue}
selectedValue={selectedValue}
categories={displayedCategories}
annotation={annotation}
onChange={onChange}/>
<br />
<div style={{textAlign: 'center'}}>
<Button size={"xl"} gray onClick={onSubmit} style={{textAlign: 'center'}}>
<span className='appkiticon icon-plus-fill'></span>
Submit
</Button>
</div>
</div>
)
}
我想要实现的是更改此部分:
const [selectedValue, setSelectedValue] = React.useState(categories[0].categoryName)
const displayedCategories = categories.filter(category => !usedCategories.includes(category.categoryName))
...因此它们displayedCategories
是上述状态中的默认值,而不像这样:
const [selectedValue, setSelectedValue] = React.useState(displayedCategories[0].categoryName)
const displayedCategories = categories.filt ...
我试图使用useEffect
钩子来过滤值,但我也不想支撑钻。关于如何实现此功能的任何好的建议?
解决方案
displayedCategories
在你的语句之前计算useState
不会违反钩子的规则,所以这很好:
const {annotation, onChange, onSubmit, categories, usedCategories} = props;
const displayedCategories = categories
.filter(category => !usedCategories.includes(category.categoryName))
const [selectedValue, setSelectedValue] = React.useState(displayedCategories[0].categoryName)
然后,如果您还想在or属性更改selectedValue
时进行更改,可以添加如下内容:categories
usedCategories
React.useEffect(() => {
setSelectedValue(displayedCategories[0].categoryName);
}, [categories, usedCategories]);
推荐阅读
- eclipse - Eclipse Markdown 预览编辑器坏了?
- sql-server - 将 SQL Server 备份文件还原到 AWS RDS 实例时增加了备份文件的大小
- tkinter - 我在使用 tkinter .get() 函数调用键的值时遇到问题
- reactjs - 如何使用 React Navigation 指定 404 页面
- date - Google 表格 QUERY 返回不匹配的记录
- angular - Native Element 未在 Angular 8 中定义
- opengl - 着色器翻转面
- angular - Angular子子路由器延迟加载
- macos - 如何检查两个 macOS 应用程序,一个代码签名和公证,在其他方面是否相同?
- javascript - 通过 openlayers 渲染 opensensemap IDW 特征