Код ниже - это простой useEffect, который запускает код для изменения переменной channel после завершения результата asyn c функции. Когда переменная установлена, я просто не могу достичь: channelResult.result.items[0].contentDetails.relatedPlaylists.uploads
, потому что он нарушает доступ к массиву ...
поэтому я могу сделать: channelResult.result
result: {}
I может делать: channelResult.result.items
result: [{}]
но не: channelResult.result.items[0]
result: error
export default function YoutubeForm() {
const [ytId, setYtId] = useState("");
const [checked, setCheck] = useState(false);
const [channel, setChannel] = useState({ result: {} });
const [upload, setUpload] = useState("");
const channelId = "UCwZmL_QQEnAerrgCDm5pV-Q";
useEffect(() => {
let items = channel.result.items; // result: [{...}]
let items = channel.result.items[0]; // result: TypeError: Cannot read property '0' of undefined
// setUpload(channelResult.result.items[0].contentDetails.relatedPlaylists.uploads);
}, [channel]);
useEffect(() => {
console.log(upload);
}, [upload]);
const handleYtIdOnChange = (e) => {
const value = e.target.value;
// debounce effect
if (timeout) {
clearTimeout(timeout);
}
timeout = setTimeout(() => setYtId(value), 1000);
};
// this function fire when user press a button,
// the function resolves a get from youtube
// server and sets its value on useState of setChannel
const checkYdId = () => {
return getChannelUploads(channelId).then((res) => setChannel(res));
};
return (
<React.Fragment>
<Typography variant="h6" gutterBottom>
Youtube
</Typography>
<Grid container spacing={3}>
<Grid container direction="row" justify="center">
<TextField
required
id="cardName"
label="ID do canal"
onChange={handleYtIdOnChange}
value={channelId}
/>
<Button color="primary" variant="outlined" onClick={checkYdId}>
Check
</Button>
</Grid>
<div style={{ maxHeight: "300px", width: "100%", overflow: "scroll" }}>
<Grid item>{checked ? <List /> : null}</Grid>
</div>
</Grid>
</React.Fragment>
);
}
как обрабатывать этот ссылочный доступ?