reactjs - 刷新后 React.js 道具变为未定义
问题描述
我正在从 firebase 数据库中提取 1000 多个关键字的庞大列表,并将其从 App.js 传递到创建自动完成搜索栏的组件。道具一开始是完美的通行证。我什至做了一个“console.log(props.keywords[30].keyword);” 我得到一个特定的关键字,它在控制台中完全按照我想要的方式显示。稍后在关键字组件的代码中,我尝试再次引用关键字,但是当我刷新页面以确保一切正常时,它显示“TypeError:无法读取未定义的属性'关键字'”。在我在浏览器上刷新之前它正在工作。我只是想这样做,以便我可以提取用户预定义的一些关键字并将它们设置为 userOptions 以在页面加载时成为芯片,然后用户可以根据需要选择更多关键字或删除他们预定义的关键字。但不知何故,它变得不确定。提前致谢。
来自 Chrome 的更多错误:
17 | function Keywords(props) {
18 | const classes = useStyles();
19 |
> 20 | console.log(props.keywords[30].keyword);
21 |
22 | //const allOptions = [props.keywords[6]];
23 | const userOptions = [props.keywords[6]];
这是组件的完整代码:
import React from 'react';
import Chip from '@material-ui/core/Chip';
import Autocomplete from '@material-ui/lab/Autocomplete';
import { makeStyles } from '@material-ui/core/styles';
import TextField from '@material-ui/core/TextField';
const useStyles = makeStyles((theme) => ({
root: {
width: '100%',
'& > * + *': {
marginTop: theme.spacing(3),
},
paddingBottom: '8px',
},
}));
function Keywords(props) {
const classes = useStyles();
console.log(props.keywords[30].keyword);
//const allOptions = [props.keywords[6]];
const userOptions = [props.keywords[6]];
const [value, setValue] = React.useState([...userOptions, props.keywords[13]]);
return (
<div className={classes.root}>
<Autocomplete
multiple
id="fixed-tags-demo"
value={value}
onChange={(event, newValue) => {
setValue([...newValue]);
}}
options={props.keywords}
getOptionLabel={(option) => option.keyword}
freeSolo
renderTags={(tagValue, getTagProps) => tagValue.map((option, index) => <Chip label={option.keyword} {...getTagProps({ index })} />)}
renderInput={(params) => <TextField {...params} variant="outlined" label="Keywords" placeholder="Roles, Locations, Etc." />}
/>
</div>
);
}
export default Keywords;
解决方案
添加到我的评论:
数据未在Keywords
组件的第一次渲染时完全加载。处理此问题的反应方式是在您的组件中构建早期返回并返回 null,以便不呈现任何内容或使用类似的钩子useMemo
来计算value? . You can pass a dependency array to
useMemo`,并且它会在依赖项发生变化时重新计算函数。
我认为在这种情况下使用钩子是适合你的方法。在其中,您可以处理尚未加载数据的情况,而是返回一些安全的默认值。
推荐阅读
- sybase-ase15 - 在 ASE Sybase 15.7 中更改存储过程
- javascript - 在什么情况下忽略 useReducer 中的扩展运算符会导致错误?
- arrays - Cs50 成员引用基类型 'candidate [9]' 不是结构或联合
- javascript - 即使整个堆栈是异步的,等待也不工作
- angular - 在Angular中将派生类属性传递给基类构造函数时出错
- python - Pycharm导入Opencv-python lib不能直接使用cv2模块
- python - 分组后的Django查询集最新对象的属性
- c - 分段错误错误(cs50 problemset week2)
- angular - 角度自动完成对象,其中对象名称与值不同
- vert.x - vertx 重新部署参数不适用于 exec-maven-plugin