React 应用SOLID原则02

React 应用 SOLID 原则 02

开放封闭原则(OCP)

定义:一个软件实体(类,模块,函数)应该对扩展开放,对修改关闭。主张在不更改源代码的情况下扩展组件的方式来构造组件

以下代码构建了一个 Header 组件,根据页面不同,Header 组件的 UI 也有些不同

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
const Header = () => {
const { pathname } = useRouter();

return (
<header>
<Logo />
<Actions>
{pathname === "/dashboard" && (
<Link to="/events/new">Create event</Link>
)}
{pathname === "/" && <Link to="/dashboard">Go to dashboard</Link>}
</Actions>
</header>
);
};

const HomePage = () => (
<>
<Header />
<OtherHomeStuff />
</>
);

const DashboardPage = () => (
<>
<Header />
<OtherDashboardStuff />
</>
);

根据所在页面的不同,呈现指向不同页面组件的链接。但是如果将该 Header 组件添加到更多的页面中,每次创建新页面的时候,都需要引用 Header 组件,改变其内部实现。这种方法使 Header 组件与他的上下文紧密耦合,违背了开放封闭原则

为了解决这个问题,我们可以使用组件组合。Header 组件不需要关系它内部的渲染是什么,相反,它可以将此责任委托给将使用 Children 属性的组件

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
const Header = ({ children }) => (
<header>
<Logo />
<Actions>{children}</Actions>
</header>
);

const HomePage = () => (
<>
<Header>
<Link to="/dashboard">Go to dashboard</Link>
</Header>
<OtherHomeStuff />
</>
);

const DashboardPage = () => (
<>
<Header>
<Link to="/events/new">Create event</Link>
</Header>
<OtherDashboardStuff />
</>
);

使用这种方法,我们完全删除了 Header 组件内部的变量逻辑。现在可以使用组合将任何内容放在 Header 中,而无需修改组件本身。

遵循开放封闭原则可以减少组件之间的耦合,使他更具有可扩展性和可重用性。