本文实例讲述了React组件设计模式之组合组件应用。分享给大家供大家参考,具体如下:
这种模式本质上解决的是组件之间传值的问题。但是它对于传值以及一些内部操控的逻辑封装得更严密。
场景:希望减少上下级组件之间props的传递,简单来说就是不用传做显式地传值,来达到组件之间相互通信的目的
举例来说,某些界面中应该有Tabs这样的组件,由Tab和TabItem组成,点击每个TabItem,该TabItem会高亮,
那么Tab和TabItem自然要进行沟通。很自然的写法是像下面这样
<TabItem active={true} onClick={this.onClick}>One</TabItem> <TabItem active={false} onClick={this.onClick}>Two</TabItem> <TabItem active={false} onClick={this.onClick}>Three</TabItem>
这样的缺点很明显:
但是,组件之间的交互我们又不希望通过props或者context来实现。希望用法如下面一样简洁。
<Tabs> <TabItem>第一</TabItem> <TabItem>第二</TabItem> <TabItem>第三</TabItem> </Tabs>
组件之间通过隐秘的方式进行通信,但这里的隐秘实际上是对props的操作在一个地方进行管理。
明白了要实现的交互,和代码层面要实现的效果,就可以开始动手了。
TabItem组件有两个关键的props: active(表明当前是否应高亮),onTabClick(自己被点击时调用的回调函数),
TabItem由于是每个Tab页面的容器,它只负责把props.children渲染出来,所以用函数式组件即可。
export const TabItem = props => { const { active, onTabClick, children } = props const style = { color: active ? 'red' : 'green', cursor: 'pointer' } return <> <h1 style={style} onClick={onTabClick}> {children} </h1> </> }
我们再来回顾一下想到达到的效果:
<Tabs> <TabItem>第一</TabItem> <TabItem>第二</TabItem> <TabItem>第三</TabItem> </Tabs>
使用组件时要避免传递props的缺点,那么在哪里传递呢?自然是是Tabs组件。但上面并没有传入props啊。
Tabs 虽然可以访问到props里边的children,但是到手的children已经是现成的如果直接改它的话,会出问题。
不可以直接改children的话,我们就把children复制一份,然后改这个复制过来的children,再渲染出去,就ok啦!
下面来看Tabs的实现:
class Tabs extends React.Component { state={ activeIndex: 0 } render() { const { activeIndex } = this.state const newChildren = React.Children.map(this.props.children, (child, index) => { if (child.type) { // 复制并修改children return React.cloneElement(child, { active: activeIndex === index, onTabClick: () => this.setState({activeIndex: index}) }) } else { return child } }) return <div className="tabs"> {newChildren} </div> } }
这里需要用到React不常用的api:
使用React.Children.map来对props.children进行遍历。
而React.cloneElement可以复制某个元素,第一个参数是被复制的元素,第二个参数我们可以把想传入的props加进去,也就是这个时机,
我们将active和onTabClick传入。实现最终效果。
这种模式比较好的把复杂逻辑完全封装起来了,抽象程度更好,比较适合开发组件开发者。针对props的扩展性也比较好,对于使用组件的开发者来说,也比较友好。
希望本文所述对大家react程序设计有所帮助。
介绍 组合模式(Composite)将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。 常见的场景有asp.net里的控件机制(即control里可以包含子control,可以递归操作、添加、删除子control),类似的还有DOM的机制,一个DOM节点可以包含子节点,不管是父节点还是子节点都有添加、删除、遍历子节点的通用功能。所以说组合模式
组合(Composite) Intent 将对象组合成树形结构来表示“整体/部分”层次关系,允许用户以相同的方式处理单独对象和组合对象。 Class Diagram 组件(Component)类是组合类(Composite)和叶子类(Leaf)的父类,可以把组合类看成是树的中间节点。 组合对象拥有一个或者多个组件对象,因此组合对象的操作可以委托给组件对象去处理,而组件对象可以是另一个组合对象或者叶
本文向大家介绍java设计模式之组合模式(Composite),包括了java设计模式之组合模式(Composite)的使用技巧和注意事项,需要的朋友参考一下 概述 是一种结构型模式,将对象以树形结构组织起来,以表示“部分 - 整体”的层次结构,使得客户端对单个对象和组合对象的使用具有唯一性。 UML类图 上面的类图包含的角色: Component:为参加组合的对象声明一个公共的接口,不管是组合还
本文向大家介绍vue slots 组件的组合/分发实例,包括了vue slots 组件的组合/分发实例的使用技巧和注意事项,需要的朋友参考一下 使用slots 分发内容 使用组件时常常会有组件组合使用的情况,如下: 直接套用组件的话,父级组件会将子级组件覆盖掉,不能实现需求的效果,为了实现该效果就需要使用 slots来内容分发 slots的使用方法如下: <app></app>标签没有引入其他组件
本文向大家介绍Java设计模式之组合模式(Composite模式)介绍,包括了Java设计模式之组合模式(Composite模式)介绍的使用技巧和注意事项,需要的朋友参考一下 Composite定义:将对象以树形结构组织起来,以达成“部分-整体” 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性。 Composite比较容易理解,想到Composite就应该想到树形结构图。组合体内这些对
本文向大家介绍JavaScript组合设计模式--改进引入案例分析,包括了JavaScript组合设计模式--改进引入案例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JavaScript组合设计模式--改进引入案例。分享给大家供大家参考,具体如下: 对于组合设计模式: (1)组合模式中把对象分为两种(组合对象,和叶子对象) (2)组合对象和叶子对象实现:同一批操作 (3)对组