React设计模式(第 1 部分)
**注:**有些模式侧重于状态管理概念,但我们可以避免和其他第三方状态管理工具,因为它们与本文的主题无关。Redux,``````Mobx
渲染道具
响应文档比比皆是:
术语"呈现道具"是指使用其值为函数的 prop 在 React 组件之间共享代码的技术。
简单地说,它只是一个函数值的道具。函数是需要呈现的组件。也许你已经看到了:React Router
<Route path='/about' render={(props) => ( <About {…props} isLoad={true} /> )} />
Enter fullscreen mode Exit fullscreen mode
此模式的主要目的是更新同级组件的道具。它使组件更可重用,并帮助我们更容易实现"关注点分离"。
让我们以以下方案为例:
- 我们需要开发一个组件。
Form
- 里面我们有 和 。
From``````p``````input
- 是用户的输入。
input
- 显示了用户写入的。
p
我们可以简单地创建类似的东西:
import React, { useState } from “react”; export default function Input(props) { return ( <> </> ); }
export default function Form() { const [value, setValue] = useState(""); return ( <Input onChange={e => setValue(e.target.value)}/> {value} ); }
Enter fullscreen mode Exit fullscreen mode
此方法存在两个问题:
1. 在这种情况下,我们不使用"关注点"概念,因为 应控制 和 而不是 。Input``````Value``````Form
2. 我们的组件不太可重复使用和灵活。
我们可以重构代码并使用渲染道具,像这样:
import React, { useState } from “react”;
function Input(props) { const [value, setValue] = useState(""); return ( <> <input type=“text” value={value} onChange={(e) => setValue(e.target.value)} /> {props.render && props.render(value)} </> ); }
export default function Form() { return ( <Input render={(value) => {value}} /> ); }
Enter fullscreen mode Exit fullscreen mode
这样,组件控制值,并且它更可重用(相同的功能可以使用不同的元素实现)。Input
HOC - 高阶组件
Higher-Order Components
基本上是一个函数,该函数接收组件作为参数,并返回具有特定业务逻辑的新组件。你可能在 “Redux” 中看到了这一点:
export default connect(mapStateToProps , mapDispatchToProps)(From);
Enter fullscreen mode Exit fullscreen mode
使用 ,您可以编写单独的功能到应用的公域(全局)功能,并在项目中的衍射组件上重用它。Higher-Order Components
让我们采取另一个场景:
- 我们需要开发两个组件。
menu
- 在第一个组件中,我们有一个需要阻止菜单单击事件。
button
- 第二个组件也是 ,但这次我们需要_处理菜单_单击事件。
button
问题是我们需要两种菜单-一种是具有停止传播能力的菜单,
另一种是没有停止的菜单。
我们可以这样使用:Higher-Order Components
import React from “react”; import “./style.css”;
function stopPropagation(WrappedComponent) { return function(){ const handleClick = event => { event.stopPropagation(); WrappedComponent.handleClick() }; return ; } }
function Button(props){ const handleClick = () => console.log(“button clicked!"); Button.handleClick = handleClick; return <button onClick={props.onClick || handleClick}>Click Me; }
function Menu(props) { const openMenu = () => console.log(“menu opened!"); return ( Menu {props.children} ); }
export default function App() { const ButtonPropagation = stopPropagation(Button); return ( ); }
Enter fullscreen mode Exit fullscreen mode
让我们分析一下此代码:
- 组件读取我们提到的两个。
App``````Menus
- 组件读取标题和子(本例中为 )。
Menu``````Button
Button
具有具有单击事件的按钮元素。 * 我们需要使用导出此函数(在类组件中,您可以使用 。**handleClick``````Button.handleClick= handleClick``````static
止损推进
是高阶组件。它接收一个组件(在我们的情况下),并发送回具有新能力的组件(在我们的情况下)。Button``````stopPropagation
这是使用 的简单示例。我们可以使用,不需要在不同的组件上再次重写。更重要的是,我们可以创建其他"按钮"HOC,如防止防御和队列点击。Higher-Order Components``````stopPropagation
- 原文作者:知识铺
- 原文链接:https://geek.zshipu.com/post/react/React%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E7%AC%AC-1-%E9%83%A8%E5%88%86/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。
- 免责声明:本页面内容均来源于站内编辑发布,部分信息来源互联网,并不意味着本站赞同其观点或者证实其内容的真实性,如涉及版权等问题,请立即联系客服进行更改或删除,保证您的合法权益。转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。也可以邮件至 sblig@126.com