当我们想在两个函数之间共享逻辑时,我们会把它提取到第三个函数中。 必须以“use”开头吗?必须如此。这个约定非常重要。不遵循的话,由于无法判断某个函数是否包含对其内部 Hook 的调用,React 将无法自动检查你的 Hook 是否违反了 Hook 的规则 小练习 使用自定义hooks实现鼠标移动位置
import React, { useState, useEffect } from "react" import icon from "../../assect/icon.png" const usePosition = () => { const [mousePosition, setMousePosition] = useState({ x: 0, y: 0 }) const MouseMove = (e) => { setMousePosition({ x: e.pageX, y: e.pageY }) } useEffect(() => { window.addEventListener('mousemove', MouseMove) return (window.addEventListener('mousemove', MouseMove)) }, []) return mousePosition } const Assembly1 = () => { const { x, y } = usePosition() return ( <div>{x}{y}</div> ) } const Assembly = () => { const { x, y } = usePosition() return ( <div> 位置{x}---{y} <img src={icon} width={'50px'} height={'50px'} style={{ position: "absolute", top: y, left: x }} /> </div> ) } export default Assembly高阶组件 高阶组件简称(HOC)是 React 中用于复用组件逻辑的一种高级技巧。HOC 自身不是 React API 的一部分,它是一种基于 React 的组合特性而形成的设计模式。 高阶组件是参数为组件,返回值为新组件的函数 小练习 使用高阶组件实现鼠标移动位置
import React from "react" import icon from "../../assect/icon.png" function withHOC(Section) {//高阶组件 return class extends React.Component { state = { x: 0, y: 0 } mouseChange = (e) => {//鼠标事件 const { pageX, pageY } = e this.setState({ x: pageX, y: pageY }) } componentDidMount=()=>{ window.addEventListener("mousemove", this.mouseChange) } componentWillUnmount = () => { window.addEventListener("mousemove", this.mouseChange) } render() { return ( <div> <Section {...this.state}></Section> </div> ) } } } const ClassSection=(props)=>{// const {x,y}=props return ( <div>{x}{y}</div> ) } const Section = (props)=>{//鼠标移动图片随之移动 const {x,y}=props return ( <div> {x},{y} <img src={icon} width={'50px'} height={'50px'} style={{position:'absolute',top:y,left:x}} /> </div> ) } const ExportComponents = withHOC(Section) export default ExportComponents
render props组件
“render prop” 是指一种在 React 组件之间使用一个值为函数的 prop 共享代码的简单技术 具有 render prop 的组件接收一个返回 React 元素的函数,并在组件内部通过调用此函数来实现自己的渲染逻辑。 小练习 使用render props组件实现鼠标移动位置import React from "react"; import icon from "../../assect/icon.png" class Event extends React.Component { state = { x: 0, y: 0 } event = (e) => { this.setState({ x: e.pageX, y: e.pageY }) } componentDidMount = () => { window.addEventListener("mousemove", this.event) } componentWillUnmount = () => { window.addEventListener("mousemove", this.event) } render() { return ( <div>{this.props.custom(this.state)}</div> ) } } const accept = () => { return ( <Event custom={({ x, y }) => ( <div> <p>{x},{y}</p> <img src={icon} width={'50px'} height={'50px'} style={{ position: 'absolute', top: y, left: x }} /> </div> )}></Event> ) } export default accept
总结:
React自定义hooks、高阶组件和render prop都是用于实现代码复用的方式,它们各有不同的特点和适用场景。自定义hooks适用于封装可复用的逻辑,高阶组件适用于增强原始组件的功能,而render prop则提供了一种灵活的方式来共享逻辑。选择使用哪种方式取决于具体的需求和场景。 标签:React,const,render,react,hook,props,组件,return From: https://www.cnblogs.com/xinyuxiangwang/p/17702033.html