reactjs - React - 通过 useContext 共享变量,以更新和重新渲染组件,但不起作用
问题描述
我正在创建一个练习应用程序(使用 MERN 堆栈和 graphql),它从用户那里获取关键字并获取与这些关键字匹配的 youtube 视频。
获取 youtube 数据后,我将该练习保存在我的 mongoDB 数据库中,并将它们保存在一个数组exerciseArr
中。这exerciseArr
是通过不同的 React 组件共享的,通过 useContext。
获取请求和接收数据发生在我的ExerciseForm
组件中。
我正在使用ExerciseList
组件来渲染那些获取的练习(保存在exerciseArr
),只要有更新exerciseArr
,它应该将项目重新渲染exerciseArr
到ExerciseVideo
. 这发生在useEffect
组件ExerciseList
中。
useEffect(() => {
console.log('exerciseArr in ExerciseList', exerciseArr)
const fetchedExercises = exerciseArr.map( exercise => (
<ExerciseVideo key={exercise._id}
id={exercise._id}
bodysection={exercise.bodysection}
duration={exercise.duration}
title={exercise.title}
videoUrl={exercise.videoUrl}
favorite={exercise.favorite}/>))
setVideoElements(fetchedExercises)
}, [exerciseArr])
现在的问题是该ExerciseList
组件仅使用来自 的第一个请求进行ExerciseForm
渲染,并且它不会重新渲染,除非您使用已渲染的视频元素(即ExerciseList
组件的 prat)启动某些操作(单击事件等)。
我的理解是,每次更新exerciseArr
,在 ExerciseList 中的 useEffect 都会重新渲染。但这不是发生了吗?
要强制重新渲染组件,我需要使用作为组件一部分的ExrciseList
现有元素启动单击事件或任何类型。ExerciseVideo
ExerciseList
这就是我渲染ExerciseList
组件的方式App
....
function App() {
const { isAuth, exerciseArr } = useContext(Context)
const hasExercise = exerciseArr.length > 0
// const authenticatedView = <><ExerciseForm/></>
return (
<div className="App">
<Switch>
<Route exact path="/">
<NavBar />
<Manual />
{ isAuth ? <ExerciseForm/> : <Login/> }
{ isAuth && hasExercise ? <ExerciseList /> : ''}
</Route>
....
我想知道我是否没有在ExerciseList
组件中正确使用 useEffect 以重新渲染自身。或者我如何渲染ExerciseList
组件App
需要改变。
有人可以帮我解决这个问题吗?
解决方案
我发现了导致问题的错误。
该useEffect
函数是正确的,但if
它应该呈现和更新的语句exerciseArr
返回 false。
if(resData.data.exercises.__typename === 'ExerciseData') {
//then save those results in exerciseArr
const graphqlResponse = resData.data.exercises.exercises
return setExerciseArr(graphqlResponse)
}
这个块的resData.data.exercises.__typename
路径以前不正确。因此根本不更新exerciseArr
。
*旁注,我将这个useEffect
功能移入Context
并仅渲染exerciseArr
以ExerciseList
创建视频div元素,以使组件更简单。
推荐阅读
- java - 具有嵌套在一级更高对象中的类型属性的杰克逊多态反序列化
- cakephp - 如何在 cakephp 表上创建一个按钮来创建一个新表?
- python - 我们如何从中获取名称等特定信息?
- java - 取消选中 Payara5 中的“包装 JDBC 对象”会出错
- html - 无法在导航栏中向右浮动我的输入区域 - 为什么?
- javascript - 警报消息关闭按钮
- python-3.x - AttributeError:“连接”对象没有属性“setdefault”|| self.__connection_settings.setdefault("charset", "utf8")
- javascript - 预填充 WTForms 字段的当前值以对其进行编辑
- python-requests - 如何使用 RESTCONF 在路由器 Cisco-IOS-XE 中激活 OSPF?
- python - 参数 on_delete 的多个值