• render-props和高阶组件


    1、React组件复用概述

    • 思考:如果两个组件中的部分功能相似或相同,该如何处理?
    • 处理方式:复用相似的功能(联想函数封装)
    • 复用什么?1.state 2.操作state的方法(组件状态逻辑)
    • 两种方式:1、render props模式 2.高阶组件(HOC)
    • 注意:这两种方式不是新的API,而是利用React自身特点的编码技巧,演化而成的固定模式(写法)

    2.思路分析

    • 思路:将要复用的state和操作state的方法封装到一个组件中
    • 问题1:如何拿到该组件中复用的state
    • 在使用组件时,添加一个值为函数的prop,通过函数参数来获取(需要组件内部来实现)
    • 问题2:如何渲染任意的UI
    • 使用该函数的返回值作为要渲染的UI内容(需要组件内部实现) 

    3.使用步骤

    • 创建Mouse组件,在组件中提供复用的状态逻辑代码(1.状态 2.操作状态的方法)
    • 将要复用的状态作为props.render(state)方法的参数,暴露到组价外部
    • 使用props.render()的返回值作为要渲染的内容 

    4.演示Mouse组件的复用

    1. //React脚手架引入图片的方式
    2. import img from './images/open.png'
    3. class Mouse extends React.Component{
    4. state={
    5. x:0,
    6. y:0
    7. }
    8. handleMouseMouve= e=>{
    9. this.setState({
    10. x:e.clientX,//实时获得鼠标的位置
    11. y:e.clientY,
    12. })
    13. }
    14. //监听鼠标移动事件
    15. componentDidMount(){
    16. window.addEventListener('mousemove',this.handleMouseMouve)
    17. }
    18. render(){
    19. return(
    20. this.props.render(this.state)
    21. )
    22. }
    23. }
    24. class App extends React.Component{
    25. render(){
    26. return(
    27. <div>
    28. <h1>render props模式h1>
    29. <Mouse
    30. render={mouse => {//感觉有点像回调函数
    31. return(
    32. <p>
    33. 鼠标的位置:x:{mouse.x} y:{mouse.y}
    34. p>
    35. )
    36. }
    37. }
    38. >Mouse>
    39. {/* 移动图片 */}
    40. <Mouse
    41. render={
    42. mouse=>{
    43. return(
    44. <img
    45. src={img}
    46. alt='open'
    47. style={{
    48. position:'absolute',
    49. top:mouse.y-16,
    50. left:mouse.x-32
    51. }}
    52. />
    53. )
    54. }
    55. }
    56. >
    57. Mouse>
    58. div>
    59. )
    60. }
    61. }
    62. ReactDOM.render(<App/>,
    63. document.getElementById('root'))

    5.children代替render属性(推荐使用

    • 注意:并不是该模式叫render props就必须使用名为render的prop,实际上可以使用任意名称的prop
    • 把prop是一个函数并且告诉组件需要渲染什么内容的技术叫做:render props模式
    • 推荐:使用children代替render属性

    //context中的用法:

            {data=>data参数表示接收到的数据---data}

    1. class App extends React.Component{
    2. render(){
    3. return(
    4. <h1>render props模式h1>
    5. <Mouse >
    6. {
    7. mouse=>{
    8. return(
    9. <p>
    10. mouse position:{mouse.x},{mouse.y}
    11. p>
    12. )
    13. }
    14. }
    15. Mouse>

    6.代码优化

    • 推荐:给render props模式添加props校验
    • 应该在卸载时解除mousemove事件绑定
    1. Mouse.propTypes={
    2. children:PropTypes.func.isRequired
    3. }
    4. //解除绑定
    5. componentWillUnmount(){
    6. window.removeEventListener('mousemove',this.handleMouseMouve)
    7. }

    关于propType报错可参考文章:http://t.csdn.cn/nQtzz

  • 相关阅读:
    为全志T507-H开发板配置Samba服务,高效实现跨系统的文件共享
    深入理解通知服务NotificationListenerService原理
    熬夜拜读349页阿里面试通关手册,成功闯入字节
    【设计模式实践笔记】第三节:建造者模式
    【oppenvino】使用docker安装openvino并进行onnx到IR中间件的转化
    基于ssm的高校校友信息管理系统设计与实现-计算机毕业设计
    内存==c语言1
    一串单词翻转——正则限制
    使用安卓Termux+Hexo,手机也能轻松搭建个人博客网站
    Docker in docker 实现
  • 原文地址:https://blog.csdn.net/weixin_53052268/article/details/126052567