美文网首页
Render Props

Render Props

作者: skoll | 来源:发表于2020-06-11 14:43 被阅读0次

解释

1 .一种在组件之间使用一个值为函数的共享代码的简单技术

<DataProvider render={data => (
  <h1>Hello {data.target}</h1>
)}/>

2 .dataProvider组件接受一个函数,这个函数返回一个react元素,并调用他,而不是实现自己的逻辑

function DataProvider(props){
  return (
    {props.render()}
)
}

举例说明

1 .一个组件封装了获取鼠标位置的数据
2 .另一个组件想要使用这个坐标。来更新对应的样式

import React from 'react'

// 这个组件追踪web应用中鼠标的位置
class MouseTracker extends React.Component{
    constructor(props){
        super(props)
        this.handleMouseMove=this.handleMouseMove.bind(this)
        this.state={
            x:0,
            y:0,
        }
    }

    handleMouseMove(e){
        this.setState({
            x:e.clientX,
            y:e.clientY,
        })
    }

    render(){
        return (
            <div style={{height:"100vh"}} onMouseMove={this.handleMouseMove}>
                <h1>移动鼠标</h1>
                <p>当前坐标位置是({this.state.x}-{this.state.y})</p>
                {/* props.render组件需要在这里显示出来,并使用我们这里的this.state这个参数 */}
                {this.props.render(this.state)}
                {/* 这里只是留了一个接口,来显示可能出现的组件 */}
            </div>
        )
    }
}

export default MouseTracker

3 .使用的元素

import React from 'react'

// 这个组件追踪web应用中鼠标的位置
class Cat extends React.Component{
    render() {
        const mouse = this.props.mouse;
        return (
          <div style={{ position: 'absolute', left: mouse.x, top: mouse.y,background:"yellow" }} />
        );
      }
}

export default Cat
// 这个还是不变的

4 .实际调用

<Mouse render={mouse=>(
        <Cat mouse={mouse}/>
      )} />

      {/* 调用,把一个组件当成props给传下去 */}

注意

1 .render prop是一个用于告知组件需要渲染什么内容的函数prop
2 .可以使用render prop的常规组件来实现大多数高阶组件
3 .react-motion 主要使用了这个技术
4 .hook 版本实现

import React ,{useState,useEffect} from 'react'
// 感觉写代码很有乐趣

// 封装一段检测鼠标移动的代码
function useMouse(props){
    const [isEffect,setEffect]=useState(props.isEffect)
    const [mouse,setMouse]=useState({x:0,y:0})

    // 如何从外部控制是否要执行这个操作呢?传入一个变量来控制,好像我是无法动态向他传入一个参数来改变里面的逻辑的。只有根据if判断使用另一个组件里面传入不同参数的hook

    function handleMouseMove(e){
        setMouse({
            x:e.clientX,
            y:e.clientY
        })
    }

    useEffect(()=>{
        document.documentElement.addEventListener("mousemove",handleMouseMove,false)
        return ()=>{
            document.documentElement.removeEventListener("mousemove",handleMouseMove,false)
        }
    })
    // 直接把mouseMove事件绑定在全局界面上,然后返回最后输出的结果

    return mouse
}

// 封装一段检测显示器屏幕的代码
function useWidth(props){
    const [width,setWidth]=useState(document.body.clientWidth)

    function handleChange(e){
        setWidth(document.body.clientWidth)
    }

    useEffect(()=>{
        window.addEventListener('resize',handleChange,false)

        return ()=>{
            window.removeEventListener('resize',handleChange,false)
        }
    })
    return width
    
}
export default useWidth

相关文章

  • React高阶组件--render props、高阶组件(Rea

    React - render props和高阶组件 1,render props模式 使用步骤 1,创建一个组件,...

  • Render Props

    "Render Props"是指一种在 React 组件之间使用一个值为函数的 prop 共享代码的简单技术。具有...

  • render props

    Problem 借用react官网的例子,当我们需要一个组件的时候,我们直接去实现它,我们初始的目标...

  • Render Props

    解释 1 .一种在组件之间使用一个值为函数的共享代码的简单技术 2 .dataProvider组件接受一个函数,这...

  • render props

    了解render props之前先来回顾一下之前学习过的高阶组件HOC,高阶组件是接收一个组件作为参数,返回一个新...

  • React学习笔记2

    1.render函数对于props和state必须是纯函数 render函数不能改变props和state的属性,...

  • Hoc Vs Render Props

    1、Hoc 2、Render Props

  • React 入门实例教程

    目录 html模板 ReactDOM.render() JSX 语法 组件 & props props & 纯函数...

  • react 基本语法

    目录 html模板 ReactDOM.render() JSX 语法 组件 & props props & 纯函数...

  • 为什么要写super(props)

    原文: Why Do We Write super(props)? 本文原文: 为什么写render(props)...

网友评论

      本文标题:Render Props

      本文链接:https://www.haomeiwen.com/subject/lhjbtktx.html