React中的几种逻辑复用方式
React class render props
mouse-position.js
import React, { Component } from 'react'
class MousePosition extends Component {
constructor(props) {
super(props)
this.state = {
x: 0,
y: 0
}
}
handleMouseMove = (e) => {
const { clientX, clientY } = e
this.setState({
x: clientX,
y: clientY
})
}
componentDidMount() {
document.addEventListener('mousemove', this.handleMouseMove)
}
componentWillUnmount() {
document.removeEventListener('mousemove', this.handleMouseMove)
}
render() {
const { children } = this.props
const { x, y } = this.state
return(
<div>
{
children({x, y})
}
</div>
)
}
}
app.js
import React from "react";
import MousePosition from "./mouse-position";
export default function App() {
return (
<div className="App">
<MousePosition>
{({ x, y }) => {
return (
<div>
<p>
x:{x}, y: {y}
</p>
</div>
);
}}
</MousePosition>
</div>
);
}
React Hoc
mouse-position.js
import React from "react";
const MousePosition = (Component) => {
class MousePositionComponent extends React.Component {
constructor(props) {
super(props);
this.state = {
x: 0,
y: 0
};
}
handleMouseMove = (e) => {
const { clientX, clientY } = e;
this.setState({
x: clientX,
y: clientY
});
};
componentDidMount() {
document.addEventListener("mousemove", this.handleMouseMove);
}
componentWillUnmount() {
document.removeEventListener("mousemove", this.handleMouseMove);
}
render() {
const { x, y } = this.state;
return <Component x={x} y={y} />;
}
}
return MousePositionComponent;
};
export default MousePosition;
app.js
import React from "react";
import MousePosition from "./mouse-position";
function App({ x, y }) {
return (
<div>
<p>
x:{x}, y: {y}
</p>
</div>
);
}
export default MousePosition(App);
React Hooks
use-position.js
import { useState, useEffect } from "react";
const usePosition = () => {
const [position, setPosition] = useState({
x: 0,
y: 0
});
const handleMouseMove = (e) => {
const { clientX, clientY } = e;
setPosition({ x: clientX, y: clientY });
};
useEffect(() => {
window.addEventListener("mousemove", handleMouseMove);
return () => {
window.removeEventListener("mousemove", handleMouseMove);
};
}, []);
return position;
};
export default usePosition;
app.js
import React from "react";
import usePosition from "./use-position";
export default function App() {
const position = usePosition();
return (
<div>
<p>
x:{position.x},y:{position.y}
</p>
</div>
);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!