当前位置: 首页 > 面试题库 >

将状态传递给React / Redux中的递归嵌套组件

秦景同
2023-03-14
问题内容

我有一个具有与组件本身相同类型的子组件的组件。我也可以渲染孩子,但是孩子似乎无法访问他们的状态。我在Redux中使用React

export class Material extends React.Component {

  constructor(props) {
    super(props)
    this.renderChild = this.renderChild.bind(this)
    this.getNestedItems = this.getNestedItems.bind(this)
  }

  static propTypes = {
    parentId: PropTypes.number,
    id: PropTypes.number.isRequired,
    name: PropTypes.string.isRequired,
    subtext: PropTypes.string.isRequired,
    childIds: PropTypes.arrayOf(PropTypes.number.isRequired),
    fileType: PropTypes.string.isRequired
  }

  // This is where I am having trouble.
  // Shouldn't the props be accessible from state itself?

  renderChild = (id, childId) => (
      <Material key={childId}
        id={childId}
        parentId={id}
        name={name}
        subtext={subtext}
        fileType={fileType}
        />
    )

  getNestedItems = (id, childIds) => {
    console.log("id: " + id)
    console.log("childIds: " + childIds)
    var childItems = []
    for(var i=0; i < childIds.length; i++){
        var child = this.renderChild(id, childIds[i])
        childItems.push(child)
    }
    return childItems
  }

  render(){

    let childItems = []
    if(this.props.childIds){
      childItems = this.getNestedItems(this.props.id, this.props.childIds)
    }

    return(
      <ListItem
        leftAvatar={<Avatar icon={fileType.length === 0 ? <FileFolder /> : <ActionAssignment />} />}
        rightIcon={fileType.length === 0 ? <AddCircle /> : <ActionInfo />}
        primaryText={name}
        secondaryText={subtext}
        initiallyOpen={fileType.length === 0} // fileType is empty if it is a folder
        primaryTogglesNestedList={fileType.length === 0}
        nestedItems={childItems} // one has to pass an array of elements
      />
    )
  }
}

const mapStateToProps = (state, ownProps) => {
  return {
    id: ownProps.id,
    name: state.Material[ownProps.id].name,
    subtext: state.Material[ownProps.id].subtext,
    childIds: state.Material[ownProps.id].childIds,
    fileType: state.Material[ownProps.id].fileType,
  }
}

export default connect(
  mapStateToProps
)(Material)

另外,我正在使用Material-ui中的ListItem(它们最终呈现在List组件中),并且我的代码受到官方redux回购中的树视图示例的严重影响。我的状态如下所示:

const initialState = {
  0: {
      id: 0,
      name: 'Root',
      subtext: 'Some subtext',
      fileType: '',
      childIds: [1]
    },
  1: {
      id: 1,
      name: 'Child',
      subtext: 'Child subtext',
      fileType: 'png',
      childIds: []
    }

}

所示状态与树状示例中的状态相同


问题答案:

好吧,如果我理解正确,那么您希望这些Material组件从redux存储中获取数据。
如果这是您要实现的目标,则需要为Redux的每个存储库提供访问redux的存储库Material。基本上,您需要使用connectHOC
将它们包装起来。
例:


const MaterialContainer = connect(mapStateToProps)(Material);

renderChild函数内部,您将使用this MaterialContainer

renderChild = (id) => (
  <MaterialContainer key={childId} id={childId} />
)

您可以在这里看到它的工作
https://jsbin.com/taquke/edit?js,输出



 类似资料:
  • [编辑] 问题不在于isAuth属性,而在于ProtectedRoad中重定向组件中的props.location!尽管如此,如果你有一个问题来理解use Selector或mapStateToProps,去@Versifici的答案! [结束编辑] 我有一个React/Redux应用程序,在authReducer中具有isAuth属性。我想将其传递给我的ProtectedRoute组件以检查行为

  • 我试图找出如何通知另一个组件状态更改。假设我有3个组件——pp.jsx、Header.jsx和SidebarPush.jsx我只是想用onclicka切换一个类。 因此,标题。jsx文件将有2个按钮,点击时将切换状态为真或假。另外两个组件是应用程序。jsx和Header。jsx需要了解这些状态的变化,以便在这些状态发生变化时可以切换类。

  • 我正在尝试学习React(使用redux),所以我正在制作一个应用程序,在其中我可以创建训练计划,将训练添加到计划中,然后将训练添加到训练中。 PlanListComponent 我的PlansList组件为每个计划呈现一张卡片。在这张卡片中,它为该计划中的每个训练呈现一个训练列表。将训练添加到计划后,“计划列表”组件不会重新渲染。添加的训练仅在我刷新页面后显示。我之所以选择这种情况,是因为我必须

  • 我想在我的组件中触发一个动作。这是一个表示组件,不需要重新创建。路由器实现是使用反应路由器冗余完成的。 main.js 应用:日新社: header.js: employee.js: action-creator.js: 道具将不包含动作,因为我没有将它绑定到道具上。我尝试在App.js中编写mapStateToProps和mapDispatchToProps,如下所示: 导出默认连接(mapSt

  • 我试图将类名传递给react组件以更改其样式,但似乎无法正常工作: 我试图通过传递具有各自风格的类的名称来改变药丸的风格。我是新来的,所以也许我做得不对。谢啦

  • 问题内容: 我是第一次使用React-router,但现在还不知道如何思考。这是我在嵌套路由中加载组件的方式。 入口点.js App.js 因此,我的App的子级是我发送的内容组件。我使用的是Flux,我的App.js具有状态并侦听更改,但是我不知道如何将该状态传递给this.props.children 。在使用react-router之前,我的App.js显式定义了所有子级,因此传递状态是自然