首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在react组件中保持强ui相关状态是不是一种糟糕的做法?

在React组件中保持强UI相关状态通常被认为是一种糟糕的做法。这是因为React的设计理念是将UI状态与组件的状态分离,通过使用组件的props和state来管理UI状态。

强UI相关状态指的是与UI外观、交互直接相关的状态,例如组件的可见性、样式、动画等。将这些状态直接存储在组件的state中会导致以下问题:

  1. 组件变得难以维护:当UI状态与组件的业务逻辑混合在一起时,组件的代码会变得混乱且难以理解。这会增加代码的复杂性,使得后续的维护和修改变得困难。
  2. 重复代码的出现:如果多个组件需要共享相同的UI状态,将这些状态存储在每个组件的state中会导致重复的代码。这不仅增加了代码量,还增加了bug的出现概率。
  3. 难以复用和测试:将强UI相关状态存储在组件的state中会使得组件难以复用和测试。因为这些状态与组件的实现细节紧密耦合,无法在不同的上下文中进行重用。

为了解决这些问题,推荐的做法是将强UI相关状态提升到组件的父组件中,通过props传递给子组件。这样可以实现UI状态的集中管理,提高代码的可维护性和可复用性。

对于React组件中的强UI相关状态,可以考虑使用以下解决方案:

  1. 使用状态管理库:例如Redux或MobX等状态管理库可以帮助管理全局的UI状态,使得状态的变化可以被多个组件共享和订阅。
  2. 使用上下文(Context):React的上下文机制可以将状态传递给组件树中的所有子组件,避免了props层层传递的繁琐。但需要注意上下文的使用时机和范围,避免滥用。
  3. 使用CSS类名切换:对于一些简单的UI状态变化,可以通过切换CSS类名来实现,而不是通过组件的state来管理。这样可以将UI状态与组件的状态分离,提高代码的可读性和可维护性。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云云开发(Serverless):https://cloud.tencent.com/product/scf
  • 腾讯云云函数(Function Compute):https://cloud.tencent.com/product/scf
  • 腾讯云云数据库(TencentDB):https://cloud.tencent.com/product/cdb
  • 腾讯云云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 腾讯云人工智能(AI):https://cloud.tencent.com/product/ai
  • 腾讯云物联网(IoT):https://cloud.tencent.com/product/iot
  • 腾讯云移动开发(Mobile):https://cloud.tencent.com/product/mobile
  • 腾讯云对象存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云区块链(Blockchain):https://cloud.tencent.com/product/baas
  • 腾讯云元宇宙(Metaverse):https://cloud.tencent.com/product/metaverse

请注意,以上链接仅供参考,具体产品选择应根据实际需求和情况进行评估。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

「 思考 」 React Hooks 设计哲学

createClass 是当时第一种用于创建 React 组件语法, 因为当时Javascript 还没有成形 Class 体系。 这种情况2015年1月17号得到了改变。...基于这个变化, React Class 组件就变成了我们之前经常见到这样: ? 是不是很熟悉。 生命周期方法和之前保持一致,变化组件初始化部分。...我们在编写react 应用时候, 难以避免一件事就是:拆分react 组件。 把一个复杂UI视图拆分成不同模块, 然后组合在一起。 这也是 react 本身推崇理念: 万物皆可是组件。...逻辑复用困难 我们都知道, react 应用其实是由一些列 UI 套件组合而成, 这些套件有些有状态, 有些没有状态。 ? 把这些组件组合在一起,处理好复用, 其实是有一定困难。...我们自己平时搬砖运动, 也要考虑自己代码是否具备一下能力: 简单好用 足够灵活 方便组合 扩展性 不坑自己, 也不坑别人, 早点下班。

67520

追寻极致体验康庄大道上,React 玩出了花

Suspense 组件可以放在(组件)Lazy 组件上方任意位置,并且下方可以有多个 Lazy 组件。...假如 loading 非常快(只需要 100ms),用户可能只感觉到了什么东西忽闪而过……又一个糟糕用户体验 当然,这样场景我们通常不加 loading,因为 loading 通常带给用户一种“慢”...,Transition 引入了一种旧内容仍然可用 Pending 状态: ?...spinner : null} ); } 这也是官方推荐做法,由 UI 组件库来考虑需要 useTransition 场景,以减少冗余代码: Pretty much any button...State:需要 delay 状态,比如 Transition 相关 也就是说,有了 Transition 之后,State 有了优先级 五.考虑牺牲 UI 一致性 对于砍不掉长 loading

1.6K20
  • 143. 精读《Suspense 改变开发方式》

    下面介绍文中给出三种取数方式,首先是最原始本地状态管理方案。 本地异步状态管理,直白但不利于维护 Suspense 方案出来之前,我们一般都在代码利用本地状态管理异步数据。... ); } } 如上所述,首先申明本地状态管理至少三种数据:异步状态、异步结果与异步错误,其次不同生命周期中处理初始化发请求与重新发请求问题,最后渲染函数根据不同状态渲染不同结果...数据与状态封闭性 - 糟糕用户体验 + 开发体验 所有数据与状态管理都存储每一个这种组件,将取数状态组件绑定结果就是,我们只能忍受组件独立运行 Loading 逻辑,而无法对他们进行统一管理...最后还是从如下几个角度进行评价: 冗余三种状态 - 糟糕开发体验 - ⭐️ 可以看到,组件只要处理成功得到数据状态即可,三种状态合并成了一种状态。...UI 组件分离,所有 UI 组件都无需关心 Pending 状态,而是当作同步去执行,这本身就是一个巨大改变。

    42020

    你不知道 React 最佳实践

    虽然不能说一种文件组织方式比另外一种更好,但保持文件组织性非常重要。 React ,随着应用不断变大,代码文件个数也会极具膨胀,且因为每个组件至少有一个与之关联文件。...每个文件夹添加 package.json 并不是一个好做法,但是它有助于轻松处理文件。...不仅在 React ,在所有的应用程序开发,通用规则都是尽可能保持代码简洁和小巧。 React 最佳实践指示保持无错误代码和精辟代码。...但是,初始状态下使用 props 并不是最佳实践。 将状态初始化为类字段是最佳实践。 使用构造函数初始化组件状态并不是很糟糕做法,但是它增加了代码冗余并造成了一些性能问题。...有状态组件存储组件状态信息并提供必要上下文。 对于无状态组件,因为不能保持状态,所以不能给用户界面的部分提供上下文。 无状态组件是可伸缩、可重用,就像纯 JavaScript 函数一样。

    3.2K10

    前端-现代 js 框架存在根本原因

    但只要你犯下了很小错误,UI状态将不再保持同步:(可能会出现)丢失或呈现错误信息、不再响应用户操作,更糟糕是触发了错误动作(如点了删除按钮后删除了非对应一项)。...框架是如何工作呢? 基于两个基本策略: 重新渲染整个组件,如 React。当组件状态发生改变时,在内存中计算出(新)DOM 结构后与已有的 DOM 结构进行对比。实际上,这是非常昂贵。...如果你应用中使用 Web components 时,想保持 UI 与内部状态同步,则需要(开发者)手工完成,或者使用如 Stencil.js (内部和 React 一样,使用虚拟 DOM) 之类库。...让我们明确一点:框架表现出巨大潜力并不体现在组件化上,保持 UI状态同步才是具体体现。Web components 并未提供相关功能,你必须手工或使用第三方库去解决(同步)问题。...我们能任意添加新逻辑来改变状态同时,不需要编写额外代码来保持 UI 同步。问题解决了! 现在,除了事件处理之外,这看起来就像个 React 应用对吧?

    2.8K10

    百度前端必会react面试题汇总

    DOM,响应 prop 或 state 改变componentWillUnmount -- 在这你可以取消网络请求,或者移除所有与组件相关事件监听器React Hooks平时开发需要注意问题和原因...(1)不要在循环,条件或嵌套函数调用Hook,必须始终 React函数顶层使用Hook这是因为React需要利用调用顺序来正确更新相应状态,以及调用相应钩子函数。...(2)HashRouter使用 URL hash 部分(即 window.location.hash)来保持 UI 和 URL 同步。... React Diff 算法 React 会借助元素 Key 值来判断该元素是新近创建还是被移动而来元素,从而减少不必要元素重渲染此外,React 还需要借助 Key 值来判断元素与本地状态关联关系...对 React 和 Vue 理解,它们异同相似之处:都将注意力集中保持核心库,而将其他功能如路由和全局状态管理交给相关库都有自己构建工具,能让你得到一个根据最佳实践设置项目模板。

    1.6K10

    React 深入系列3:Props 和 State

    组件props 和 state都和组件最终渲染出UI直接相关。...state必须能代表一个组件UI呈现完整状态集,即组件对应UI任何改变,都可以从state变化反映出来;同时,state还必须是代表一个组件UI呈现最小状态集,即state所有状态都是用于反映组件...组件中用到一个变量是不是应该作为组件state,可以通过下面的4条依据进行判断: 这个变量是否是通过props从父组件获取?如果是,那么它不是一个状态。...这个变量是否组件整个生命周期中都保持不变?如果是,那么它不是一个状态。 这个变量是否可以通过state 或props 已有数据计算得到?如果是,那么它不是一个状态。...请务必牢记,并不是组件中用到所有变量都是组件状态!当存在多个组件共同依赖同一个状态时,一般做法状态上移,将这个状态放到这几个组件公共父组件

    2.8K60

    使用 useState 需要注意 5 个问题

    众所周知,hook React 组件开发变得越来越重要,特别是功能组件,因为它们已经完全取代了对基于类组件需求,而基于类组件是管理有状态组件传统方式。...然而,没有人直接告诉你是,根据组件状态期望,使用错误类型值初始化 useState 可能会导致应用程序中意外行为,例如无法呈现 UI,导致黑屏错误。...然而,这是一种不好做法,可能会导致预期行为,如上所示。 初始化 useState 首选方法是将预期数据类型传递给它,以避免潜在空白页错误。...但是,直接更新状态一种不好做法处理多个用户使用实时应用程序时可能会导致潜在错误。为什么?因为与你所想相反,React 不会在单击按钮时立即更新状态。...在这个事件函数,我们有一个 setUser() 状态函数,它接受用户以前/当前状态,并使用拓展操作符解包这个用户状态。然后检查事件对象触发函数目标元素名(与状态属性名相关)。

    5K20

    React组件设计实践总结02 - 组件组织

    React , 组件就是模块. 单一职责要求将组件限制一个’合适’粒度. 这个粒度是比较主观概念, 换句话说’单一’是一个相对概念....高内聚, 要求一个组件有一个明确组件边界, 将紧密相关内容聚集一个组件下, 实现”专一”功能....Redux 建议保持组件纯净性, 将组件状态交给 Redux 和配套异步处理工具来维护, 这样就将整个应用抽象成了一个”单向数据流”, 这是一种简单”输入/输出”关系 image.png 不管是...实际 React 开发, 非受控组件场景非常少, 我认为自定义组件都可以忽略这种需求, 只提供完全受控表单组件, 避免组件自己维护缓存状态 ---- 4....组件划分示例 我们一般会从 UI 原型图中分析和划分组件, React 官方Thinking in react也提到通过 UI 来划分组件层级: “这是因为 UI 和数据模型往往遵循着相同信息架构

    1.9K31

    他开发了redux,昨晚字节一面却挂了?

    ,我觉得next.js是可以把react相关观念去简化,所以他有可能会取代目前功能,如果大家对Server Component 感兴趣的话,你思考模式是围绕组件进行,这是可控,那你也可以做出自主决定...,吧什么样组件服务器去运转,不会占用你太长时间,代码也是一样,他们会更加清晰,你就不需要去思考你是在做渲染还是做别的事情,这是一种很不错优化 Q12: 对于找工作同学来说,什么样科技公司更吸引人...Q13: 说说你个人经历,你刚加入facebook,如何学习react相关知识 react代码其实比较复杂,最开始需要研究代码,去熟悉,主要还是去了解整个架构,把它了解透彻了没问题了,就Ok了...Q15: 作为react用户,我们去看源码,是不是一个好做法 我并不认为很有必要,因为很难去理解我们源码,如果你直接去读,你可能会很困惑,因为你不了解底层框架,有人跟你解释一下可能更好一些。...,所以可以从性能这个方面看到这些基本功能目的是什么 Q16: 你是如何保持react热情 我本身就很喜欢,react理念跟我对ui代码想法很一致,我facebook之前,初创公司,当时直接用了

    27420

    他开发了redux,昨晚“字节一面“却挂了?

    ,我觉得next.js是可以把react相关观念去简化,所以他有可能会取代目前功能,如果大家对Server Component 感兴趣的话,你思考模式是围绕组件进行,这是可控,那你也可以做出自主决定...,吧什么样组件服务器去运转,不会占用你太长时间,代码也是一样,他们会更加清晰,你就不需要去思考你是在做渲染还是做别的事情,这是一种很不错优化 Q12: 对于找工作同学来说,什么样科技公司更吸引人...Q13: 说说你个人经历,你刚加入facebook,如何学习react相关知识 react代码其实比较复杂,最开始需要研究代码,去熟悉,主要还是去了解整个架构,把它了解透彻了没问题了,就Ok了...Q15: 作为react用户,我们去看源码,是不是一个好做法 我并不认为很有必要,因为很难去理解我们源码,如果你直接去读,你可能会很困惑,因为你不了解底层框架,有人跟你解释一下可能更好一些。...,所以可以从性能这个方面看到这些基本功能目的是什么 Q16: 你是如何保持react热情 我本身就很喜欢,react理念跟我对ui代码想法很一致,我facebook之前,初创公司,当时直接用了

    76611

    「前端架构」React,Angular还是Vue,太难选了?看完秒懂。

    将函数作为属性传递是修改父组件状态常见做法。它使得所有的东西都是松散耦合、模块化、快速。...Angular应用程序总是有一个支持引导根模块,通常有一堆特性模块。NgModules是将相关代码收集到功能组件基本构建块。 组件为屏幕元素定义视图,并使用与视图不直接相关特定功能服务。...类型语言有许多优点,比如出现错误机会更少、工具更好、重构功能更强大以及总体上可维护性更好。我们也推荐它用于React项目。 与其他鼓励自由框架不同,Angular通常有一种建议做事方式。...除了呈现HTML视图外,它还具有双向数据绑定,以使UI更改与数据同步,反之亦然。它比React单向绑定直观得多,使它更容易静态网站添加动态功能。...结论 对于一个新项目来说,这三个框架任何一个都不会完全出错。明智做法是将你决定主要建立在你团队现有的专业知识之上。 当涉及到小部件和其他可嵌入UI组件时,Preact是最好

    6.3K40

    React面试八股文(第一期)

    对 Redux 理解,主要解决什么问题React是视图层框架。Redux是一个用来管理数据状态UI状态JavaScript应用工具。...(Redux支持React、Angular、jQuery甚至纯JavaScript)。 React UI组件形式来搭建,组件之间可以嵌套组合。...主要解决问题: 单纯Redux只是一个状态机,是没有UI呈现react- redux作用是将Redux状态机和ReactUI呈现绑定在一起,当你dispatch action改变state时候...react组件划分业务组件技术组件?根据组件职责通常把组件分为UI组件和容器组件UI 组件负责 UI 呈现,容器组件负责管理数据和逻辑。...这种组件React中被称为受控组件受控组件组件渲染出状态与它value或checked属性相对应,react通过这种方式消除了组件局部状态,使整个状态可控。

    3.1K30

    React16错误处理

    (https://github.com/facebook/react/issues/10294) React15和更早版本行为 在过去,组件内部JavaScript错误会破坏React内部状态,...这些错误经常是由代码早期错误引起,但是React并没有提供一种组件优雅地处理它们方法,并且无法从它们恢复过来。 引入错误边界 UI部分一个JavaScript错误不应该破坏整个程序。...我们讨论了这个决定,但根据我们经验,把损坏UI留下比彻底删除更糟糕。例如,像Messenger这样产品,留下破损UI可能导致某人向错误的人发送消息。...如果某个UI区域中某个组件崩溃,剩下部分仍然保持交互。 我们也鼓励您使用JS错误上报服务(或建立您自己),您可以了解他们在生产中发生未处理异常,并修复。...现在你可以精确地看到组件哪部分发生了错误: ? 你也可以看到文件名和行号组件堆栈跟踪。这在Create React App脚手架是默认: ?

    2.5K20

    ReactJS和React-Native主要区别在哪里

    这些React-Native组件映射了应用程序上呈现实际真正原生iOS或Android UI组件。...使用React-Native,您将学到一种全新方式,通过Javascript为应用程序不同组件设置动画。动画化组件推荐方法是使用React-Native提供Animated API。...然后,我开始想知道导航切换是如何工作,我发现了React-Native提供Navigator组件。我应该从这开始,寻找一个替代react-router在我看来不是最好做法。 ?...我确信你为现代浏览器写代码时遇到过类似的问题,而且需要在旧浏览器中看起来“不太糟糕”,在这里添加一些条件代码,在那里Javascript甚至Javascript 。...我建议您将组件主要逻辑定义一个名为index.js文件,然后您将使用单个文件定义演示组件

    17K30

    从 Styleguidist 迁移到 Storybook

    Styleguidist 还可以用于生成静态文档页面(样式指南),并分享给其他利益相关者。文档是用 Markdown 创建,带有代码块,这些代码块一个单独交互式沙盒中渲染 React 组件。...开发人员必须为每个组件创建许多排列,以显示组件可能支持一种状态。 通过编辑 Markdown 来修改组件状态对于开发人员和非技术用户来说并不直观。...这与性能糟糕 Styleguidist 形成了对比,Styleguidist 总是会渲染包每一个组件每一个示例。... Storybook ,开发人员可以通过 react-docgen 自动生成控件,用户可以文档 UI 中直接修改和预览组件。...为了保持现有 React 组件示例并减少开发人员迁移过程负担,我们列出了以下这些需求: 我们现有的 Styleguidist 文件使用了 ES5 风格导入和语法。

    1.4K20

    谈一谈我对React Hooks理解

    0x00 ReactuseEffect React中有非常多Hooks,其中useEffect使用非常频繁,针对一些具有副作用函数进行包裹处理,使用Hook收益有:增强可复用性、使函数组件状态...不过在后来不断地学习以及运用之后,我个人觉得hooks其实是一种非常轻量方式,项目构建中,开发自定义hooks,然后应用程序任意地方调用hook,类似于插件化(可插拔)开发,降低了代码耦合度...我对于hooks心智模型,简单来讲,就是一种插件式、有状态、有序工具函数。...整个执行过程可以简单总结如下: 组件被点击,触发更新count为1,通知React,“count值更新为1了” React响应,向组件索要count为1UI 组件: 给count为1时候虚拟DOM...而在类组件,通过 this.setState() 做法每次拿到也是最新值 ---- 0x04 effect清理 在前面的描述或多或少涉及到对于effect清理,只是为了便于一个理解,但描述并不完全准确

    1.2K20

    useTransition真的无所不能吗?🤔

    App将保持切换Button状态并渲染正确组件。...理论上来说,渲染100个组件React来说小菜一碟,但架不住每个组件需要10毫秒。那就得到一个糟糕结果,渲染B页面将需要1秒钟。...❝“后台”是一种数据抽象:有几点需要说明 由于JavaScript是单线程繁忙“后台”任务执行过程React将定期检查主队列。如果队列中出现新任务,它将优先于“后台”工作。...这里问题在于, ❝如果我们将状态更新包装在一个过渡React并不只是"后台"触发状态更新。实际上,这是一个「两步过程」。...因此,如果我们将setData包装在startTransition,由此引起初始重新渲染不会太糟糕:它将使用空状态和加载指示器重新渲染。

    40010

    聊一聊状态管理和concent设计理念

    ,我们可以直接修改状态,mbox会自动驱动ui渲染更新,因其响应式理念和vue很相近,react里搭配mobx-react使用后,很多人戏称mobx是一个将react变成了类vue开发体验状态管理方案...我心中理想方案 上述相关各种方案,都各自在一定程度上能满足我们需求,但是对于追求完美的水瓶座程序猿,我觉得它们终究都不是我理想方案,它们或小而美、或大而全,但还是不够,不够友好,所以决定开始自研状态管理方案...Foo组件里声明state,其他地方看起来是不是给你一种感觉:这不就是一个地地道道react组件标准写法吗?...,是不停迭代过程反复抽象逐渐沉淀下来。...ui更新时机,仅将他们返回新部分状态按模块分类合并后暂存起来,最后源头函数调用结束时才一次性提交到store并触发相关实例渲染。

    3.5K262

    React Advanced Topics

    错误边界是一种 React 组件,这种组件可以捕获并打印发生在其子组件树任何位置 JavaScript 错误,并且,它会渲染出备用 UI,而不是渲染那些崩溃了组件树。...React 需要基于这两棵树之间差别来判断如何有效率更新 UI 以保证当前 UI 与最新保持同步。 这个算法问题有一些通用解决方案,即生成将一棵树转换成另一棵树最小操作数。...在这个概念里,UI一种理想化,或者说“虚拟”表现形式被保存在内存,并通知如ReactDOM等类库使之与“真实”DOM同步。这一过程叫做“协调”。...能够父元素与子元素之间交错处理,以支持 React 布局。 能够 render() 返回多个元素。 更好地支持错误边界。 为了做到这一点,我们首先需要一种将工作分解成多个单元方法。...也就是说,虚拟DOM对比过程,如果发现一个元素实例有更新,则会立即同步执行操作,提交到真是DOM更改。折动画、布局以及手势等领域,可能会带来非常糟糕用户体验。

    1.7K20
    领券