Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs Resact userReducer init函数在道具更新时未触发_Reactjs_State_Reducers - Fatal编程技术网

Reactjs Resact userReducer init函数在道具更新时未触发

Reactjs Resact userReducer init函数在道具更新时未触发,reactjs,state,reducers,Reactjs,State,Reducers,我有一个组件,它是我用来在数据库中创建记录的表单。我还希望能够将用于填充表单的值传递到此组件中,从而允许我更新现有的数据库记录。从同一组件直接添加/编辑功能 下面的代码应该解释我是如何做到这一点的。媒体道具是包含数据的对象。我在父元素中已经有了这些数据,所以在这里设置值是很好的,它们可以顺利通过。但是,一旦加载页面,useReducer的第三个init参数就不会重新触发,因此我的状态不能用媒体中传递的值覆盖。当道具更新时,是否有正确的方法触发init函数,或者我的问题是结构性的 const Me

我有一个组件,它是我用来在数据库中创建记录的表单。我还希望能够将用于填充表单的值传递到此组件中,从而允许我更新现有的数据库记录。从同一组件直接添加/编辑功能

下面的代码应该解释我是如何做到这一点的。
媒体
道具是包含数据的对象。我在父元素中已经有了这些数据,所以在这里设置值是很好的,它们可以顺利通过。但是,一旦加载页面,
useReducer
的第三个
init
参数就不会重新触发,因此我的状态不能用
媒体中传递的值覆盖。当道具更新时,是否有正确的方法触发
init
函数,或者我的问题是结构性的

const MediaUploadForm = ({ media }) => {

  const init = (initialState) => {

    if (media) {
      // ... here I extract the values I need and override the initialState where required 
    } else {
      return initialState
    }
  }

  const [formState, dispatch] = useReducer(
    MediaFormReducer,
    initialState,
    init
  )

因此,使用新的React hooks功能并保持组件的功能允许我使用
useEffects()
这类似于使用
componentDidUpdate
类型事件。因此,下面的代码允许我检查道具(
media
)的状态,然后发送一个设置我的redux状态的操作

useEffect(() => {
    if (media && id !== media.id) {
      dispatch(loadMedia(media))
    }

  })

感谢@sliptype为我指明了正确的方向

将道具复制到状态被认为是React中的反模式。如您所见,道具更改不会触发重新初始化状态

这在中进行了描述

从概述来看,当前建议的解决方案似乎是匹配的

备选方案1:要仅重置某些状态字段,请注意特殊属性(例如props.userID)中的更改

这是一个替代方案,而不是建议


希望此链接能为您提供有关此主题的更多信息,其中的建议有助于今后的工作。

我认为在rerender上重新初始化减速器状态没有意义。媒体
未定义
是第一次
媒体上传表单
呈现吗?我认为当你的道具change@sliptype是的,那似乎是更好的建筑。我试图让它成为一个功能组件,我意识到将useReducer与useEffects结合是一个解决方案。谢谢你朝着正确的方向努力。如果第二天左右没有其他人有更好的答案,我会用我的答案回答我自己的问题。