React 应用程序中的数据流,带有功能组件和钩子



我正试图了解React应用程序中的数据流,该应用程序具有功能组件&挂钩。

我想知道:

  1. 当数据更改(状态更改)导致执行级联代码时。。。什么代码(比如说,在每个组件中,运行和不运行…显然存在选择性,比如"如果你不想运行那个代码,就不要把那个变量放在deps数组中")
  2. ";家庭;在这样的数据级联过程中确定的家谱的一部分?数据会传递给兄弟姐妹吗?它是否只传给子级(如果函数是为更新父级而传递的,则传给父级)

为了澄清我的想法,我在每个文件名结尾都使用了这样的标签约定:我声称(并要求更正!)1是2的父级;2是3a(我认为…自定义钩子可以是"子"吗?)、3b和3c的父对象;3c是4c的父代。

显然,父/子数据流是React的自然组成部分。兄弟姐妹对兄弟姐妹呢?这就是问题发生的地方吗?当然"传递数据";在给定的文件中可能是危险的(相对于控制是否以及何时呈现一段数据),显然解决方案是";升降机;树上的数据。但即便如此。。。如果不清楚数据是如何回流的,那么将数据提升一个级别(或更高级别)是没有意义的。。。以及我们应该寻找哪些问题。

index1.tsx

...
<App/>
...

App2.tsx

...
const App = () => {
...
const {varFromCustomHook} = useAppLogic(varToCustomHook);
...
<FooComponent varToFoo={varToFoo} functToFoo={functToFoo}/>;
<BarComponent/>;
...
};
...

useAppLogic3a.tsx

...
interface Props {
varToCustomHook;
};
const useAppLogic (props: Props) {
...
return {varFromCustomHook};
};

FooComponent3b.tsx

...
interface Props {
varToFoo;
functToFoo;
}
const FooComponent = (props: Props) => {
...
funcToFoo(importantData);
...
<div>{varToFoo}</div>;
...
};

BarComponent3c.tsx

...
const BarComponent = () => {
...
<FoobarComponent/>;
...
};

FoobarComponent4c.tsx

...
const FoobarComponent = () => {
...
};

react组件就是react组件,无论是基于类的组件还是功能组件都是实现细节。数据流向下反应树,父级到子级,以道具的形式。这是React中的一个普遍真理。

当数据更改(状态更改)导致代码级联处决什么代码(比如说,在每个组件中,运行和不运行。。。显然存在选择性;不要把那个变量放进去deps数组(如果你不想让代码运行)?

当状态和/或道具更新时,会重新绘制功能组件。功能组件的整个功能体在技术上是;渲染";函数,所以当组件渲染时,它的所有都会运行。

你特别问关于钩子的问题。每个渲染周期也会按照声明的顺序执行钩子,如果存在依赖项数组,则会对其进行评估,如果任何依赖项未通过浅引用相等检查,则会触发钩子的回调。

;家庭;在这种情况下确定的家谱的一部分数据级联?数据会传递给兄弟姐妹吗?它只给孩子吗(如果函数是为更新父级而传递的,则为父级)?

React树的确定方式与它几乎总是一样,一个根节点和子节点,其中每个子组件可以有更多的子节点。数据仍然只从父级传递到子级。回调仍然作为子组件调用的道具(通常)传递。

评论问题

useAppLogic是否被视为[在这种情况下是应用程序的]子级,或者可以自定义钩子不被视为儿童(无论出于何种原因)?假设答案是肯定的,然后无法使用AppLogic返回一个值传递给它的兄弟FooComponent?如果是,这不是数据吗流动的";"水平";而不是向下?我不知道答案。。。但是似乎这种数据传递是可能的(可能是反模式,我不知道)。

不,useAppLogic是一个react钩子,不能是任何东西的子级,它是一个函数。只有react组件、HTML元素和基元(字符串、数字等)可以是子级,呈现为JSX。数据只向下流动。如果数据需要传递给兄弟姐妹,则需要至少传递给最近的共同祖先。如果useAppLogicApp中,而FooComponent是App的子级,则钩子返回的任何值都可以作为道具传递给FooComponent

如果(在上述情况下,我们在这些评论中进行了讨论)useAppLogic同时被App和App的孩子FooComponent使用?将这是反模式吗?这显然会让父母和孩子有一段不是";传下来";。(出门在四肢上。。。这是了解全球对话的窗口吗data/useReducer?)。也许评论中的这些观点会有所帮助一些人,如果他们在答案中。

React钩子都是自己的实例。他们不共享任何州,也不共享任何其他州。没有足够的上下文来说明使用同一个react钩子的父组件和子组件是否都是反模式,但我倾向于说不,不是,因为任何功能组件都可以出于任何原因使用任何react钩子。没有一个进入任何全局数据的窗口(useContext钩子将与某些"全局"数据一样接近)。

最新更新