关于 react 编程思路的问题

2021-04-26 21:11:19 +08:00
 DreamTrace

萌新,最近看了一下react,感觉它很依赖于状态管理?不知道是不是因为JSX语法的原因,函数 /类组件只能在<ComponentName />中传入相应props,如果父组件要访问子组件的方法就必须传入一个类似SetHandler()的方法把子组件的方法绑定到父组件的state上,而这样不就相当于把子组件的statefunction移到父组件上吗?似乎没有类似SubComponentName.funName()的访问方式...有点迷茫,可能说的不是很清除,不知道大家是怎么解决这个问题的?

3769 次点击
所在节点    React
30 条回复
Jirajine
2021-04-26 21:29:00 +08:00
React 的核心思想就在于 f(state) = ui,数据流是单向的,你得先把思维方式转变过来。
momocraft
2021-04-26 21:35:59 +08:00
像这样手工用 props 连接也是可以

react 自带的以前有 ref + class component 可能最接近你找的那种

现在有 useImperativeHandle
hello2060
2021-04-26 21:40:17 +08:00
后端,只学过 react,没正儿八经用过。

你是不是把概念理解错了,这里的父组件是更高一级的组件,拥有子组件。相当于一个页面组件拥有 header 组件,拥有 footer 组件

而不是面向对象里的父子组件是继承关系,这里没有继承关系啊。那父组件为啥要调用子组件的功能?父组件 render 的时候子组件也自动会 render, 这不就够了吗?

数据是夫传给子的,既然数据在父那,对数据的操作自然也是父负责,所以子只要回调就行。
love
2021-04-26 22:04:01 +08:00
一定需要调用子组件的内部方法的情况非常少,绝大部分情况还是简单地维护各层 state 就行了,比传统方式简单可靠多了
JerryCha
2021-04-26 22:19:38 +08:00
恭喜你,依靠自己悟出了 React 编程的一大重点:状态提升
beizhedenglong
2021-04-26 22:20:39 +08:00
@Jirajine 你没说到点子上,vue 也是单向的
across
2021-04-26 22:38:33 +08:00
因为 React 只是个 View 层数据流,在 MVC 视角下,你是想把 VC 都放在 ReactComponent 下···· 这事儿就不应该放 View 层做。
qiuxuqin
2021-04-26 22:40:01 +08:00
@beizhedenglong vue 的子组件通过 emit 事件,然后父组件接收事件进行处理,这里哪里是单向的了?而且父组件可以直接通过 this.$refs.childComponent 获取到子组件内部的各种变量和方法,这跟单向流动差远了。
beizhedenglong
2021-04-26 22:45:23 +08:00
@qiuxuqin 按照你这这个逻辑,react 通过 callback 回调传数据和 emit 事件传数据又有啥本质区别?
agdhole
2021-04-27 00:07:40 +08:00
搜一下 immutable
Rocketer
2021-04-27 01:33:39 +08:00
状态管理算是个 hack,初学先别考虑那个。

React 最重要的基本概念之一就是数据单向流动,只能从父流向子。所以几个组件要想共享数据,就得找个共同的祖先来持有那个数据。

至于更新状态的函数,你也当数据来用就行了,毕竟 JavaScript 里一切皆对象,字符串和函数一视同仁。
mongodb
2021-04-27 02:06:53 +08:00
@Rocketer 那会不会不小心容易写出一种倾向,让最高的父干脆全部负责数据处理得了。。。
Rocketer
2021-04-27 02:29:11 +08:00
@mongodb 状态管理本质上就是这么个东西啊。所以说初学先别考虑状态管理,等彻底理解了 React 再看。
seki
2021-04-27 03:28:35 +08:00
如果一个组件 props 在更新,自己的 state 也在更新,两部分想归到同一个流里面需要思考很多情况,强行写出来性能可能也会比较差

把组件分离成专门用于显示的内容的,以及专门用来处理数据的会让逻辑更简单,实现单向数据流也会更少心智负担

再复杂到一定阶段就会用 context 和 redux / recoil / mobx 之类来把数据处理单独抽出来了
walpurgis
2021-04-27 08:48:02 +08:00
https://zh-hans.reactjs.org/docs/lifting-state-up.html
数据和逻辑提到父组件是官方推荐做法
gouflv
2021-04-27 09:06:20 +08:00
1. 如果子组件本身足够复杂,外部可以通过注入类似服务的对象,由服务来间接控制子组件,参考 antd 的 useForm
2. 简单的子组件,用 useImperativeHandle 暴露 api
jguo
2021-04-27 09:08:05 +08:00
父组件调用子组件的方法意味着强耦合,不符合 react 的思路
forsigner
2021-04-27 10:05:38 +08:00
可以开始了解 React 之状态管理大乱斗了
shunia
2021-04-27 10:20:40 +08:00
这和状态管理有啥关系。。。你只要把 <Component /> 理解成 function Component() {} 就好了。
DOLLOR
2021-04-27 10:39:58 +08:00
父组件没必要去访问子组件内部的状态。
就像你调用函数的时候,函数外部没必要去获取函数内部的局部变量。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/773449

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX