我正在学习反应,我正在尝试创建一个TreeView组件。 此TreeView可以自己接收数据(通过数据' prop)或作为休息资源的URL。我在这里专注于最后一个选项。
该组件首先在“加载”中呈现。 state和ajax调用是在componentDidMount上进行的。 当从REST服务返回数据时,我只需将其分配给组件' props.data'和setState({loading:false})并正确呈现填充的树。
这里的一个问题是,我从组件本身改变道具是一种反作用的反模式,但是对于向状态添加数据并不感觉正确。 我倾向于将状态视为与UI交互相关,并将其用于诸如"折叠"之类的内容。或者"选择" 更新父组件(包含TreeView的组件)时,treeView'数据' prop被重置(componentDidMount没有被调用,所以它甚至没有再次获取)和组件中断。 使用'状态'修复此问题,因为在此父级重新渲染期间维护了它的值。
应该在这里使用州吗?有没有更好的模式呢?
除了从服务器检索数据之外,还有改变树数据本身的问题(比如移动树项而不是另一个地方) 现在我只需更改' props.data'中的项目。和forceUpdate相关的内部组件。
我应该只在TreeView根组件中使用state和setState,让我们再次对整个事物做出反应吗?顺便说一句,它是一棵很大的树...... 我是否应该将树包装在其他数据组件中,这些组件将传递数据'?
有人可以帮助找到构建此组件的最佳方法吗? 谢谢,圣诞快乐:)
答案 0 :(得分:0)
您可以在父组件的componentDidMount
方法(包含TreeView
的方法)中调用Rest服务,并将树数据设置为父组件状态。这样你就不会自己改变组件的道具,而父组件更新也不会重置Treeview's
数据。 (更好的做法是使用Flux存储来存储和获取数据,并通过控制器视图将这些数据传递给TreeView
。)
至于更改树数据本身,您可以在父组件中定义回调函数,并在数据更改时从TreeView
调用这些函数。实际数据分配发生在父组件的回调函数中。这会导致父组件重新呈现,它会重新呈现TreeView
。 (另一种更好的做法是在父组件中调用Flux操作来更改存储中保存的数据,然后传播到视图。)