ReactJS 高阶组件不在渲染循环中转发属性

Posted

技术标签:

【中文标题】ReactJS 高阶组件不在渲染循环中转发属性【英文标题】:ReactJS high order components not forwarding property in a render loop 【发布时间】:2015-12-23 20:04:18 【问题描述】:

我正在寻找一些指导。我遵循React Drag-n-Drop chess tutorial 将相同的原则应用于我的项目。但是当子类需要递归重复时,我就卡住了。当 Child 从 Parent 渲染时,一切正常。但是,当我从 Child 渲染函数递归渲染 Child 时,我会收到有关丢失默认道具的错误,这些道具应该根据高阶组件的工作方式由 DragSource() 转发。我会在代码下面给出props的控制台输出。

下面的代码是我正在尝试做的简化版本:

Constants.js

export const ItemTypes = 
  CHILD: 'child'

Parent.jsx

import React,  PropTypes  from 'react'
import Child from './Child'
import  DragDropContext  from 'react-dnd'
import html5Backend from 'react-dnd/modules/backends/HTML5'

class Parent extends React.Component 
  render () 
    return (
      <Child />
    ) 
  


export default DragDropContext(HTML5Backend)(Parent)

Child.jsx

import React,  PropTypes  from 'react'
import  ItemTypes  from './Constants'
import  DragSource  from 'react-dnd'

const taskSource = 
  beginDrag (props) 
    return 
      index: props.index
    
  


function collect (connect, monitor) 
  return 
    connectDragSource: connect.dragSource(),
    isDragging: monitor.isDragging()
  


class Child extends React.Component 
  static get propTypes () 
    return 
      index: PropTypes.number,
      connectDragSource: PropTypes.func.isRequired,
      isDragging: PropTypes.bool.isRequired
    
  

  constructor(props) 
    super(props)

    console.log(props)

    this.state = 
      children: [1, 2, 3, 4]
    
  

  render () 
      const  connectDragSource, isDragging  = this.props

      return connectDragSource(
          <ul className='children'>
             this.state.children.map((child, i) =>
              <li key=child>
                <Child index=i ref='child/' + i />
              </li>
            ) 
          </ul>
      )
  


export default DragSource(ItemTypes.CHILD, taskSource, collect)(Child)

从父组件渲染函数调用时子组件道具的 Console.log 输出


  _id: "123"",
  connectDragSource: fn(),
  isDragging: false

从子组件渲染函数递归调用时子组件道具的 Console.log 输出


  _id: "1234"
  index: 0


ERROR: Uncaught (in promise) TypeError: connectDragSource is not a function

所以基本上我认为正在发生的事情是高阶组件没有将默认道具转发给从子组件循环呈现的子组件。

我很想得到任何人的建议,因为我已经研究了几个小时了。谢谢。

【问题讨论】:

【参考方案1】:

所以这实际上是我学到的一个非常简单的答案。 Parent.jsx 中导入的子代与 Child.jsx 中的子代不同。父类中的子类具有高阶组件的行为,而对自身的子引用尚未应用高阶组件。为了解决这个问题,我必须在 Child.jsx 中这样做:

render () 
  const  connectDragSource, isDragging  = this.props

  return connectDragSource(
      <ul className='children'>
         this.state.children.map((child, i) =>
          <li key=child>
            <HigherChild index=i ref='child/' + i />
          </li>
        ) 
      </ul>
  )


const HigherChild = DragSource(ItemTypes.CHILD, taskSource, collect)(Child)

export default HigherChild 

【讨论】:

谢谢。我想了解的是为什么这样做:&lt;li key=child&gt; DragSource(ItemTypes.Child, taskSource, collect)(&lt;Child index=i ref='child/' + i /&gt;) &lt;/li&gt; 不能直接在 JSX 中工作

以上是关于ReactJS 高阶组件不在渲染循环中转发属性的主要内容,如果未能解决你的问题,请参考以下文章

React.forwardRef与useImperativeHandle

ReactJs 上的无限循环渲染组件

重新渲染 Reactjs 数组组件

ReactJS:即使在重新渲染组件后复​​选框状态仍然存在

ReactReact全家桶组件+组件三大核心属性state-props-refs+事件处理与条件渲染+列表与表单+状态提升与组合+高阶函数与函数+函数柯里化

ReactReact全家桶组件+组件三大核心属性state-props-refs+事件处理与条件渲染+列表与表单+状态提升与组合+高阶函数与函数+函数柯里化