美文网首页
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
    

    相关文章

      网友评论

          本文标题:Render Props

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