render-props模式
第一种写法:
在mousemove案例中,我自己使用的方式是父子传值的方式进行数据的传递。
有没有更简单的方式呢?
首先通过render将子组件中的数据state返回出去
子组件代码块:
import React, { Component } from 'react'
export default class index extends Component {
constructor(){
super()
this.state={
x:0,
y:0
}
}
render() {
return this.props.render(this.state)
}
componentDidMount(){
window.addEventListener("mousemove",this.mouseMoveHandler)
}
mouseMoveHandler=(e)=>{
this.setState({
x:e.clientX,
y:e.clientY
})
}
}
在父组件挂载时,同样通过render进行数据的接收,拿到数据后,return数据渲染的模板。
类似于Vue.js中的插槽
render() {
return (
<div className="list">
<Mouse render={data=>{
return <p>{data.x}</p>
}}></Mouse>
</div>
)
}
第二种写法:
子组件中将render换成children
render() {
return this.props.children(this.state)
}
父组件中挂载的方式有所不同
<Mouse>
{
({x,y})=>{
return <p>{x}:{y}</p>
}
}
</Mouse>
个人认为第二种更好理解使用一些,同样的一个组件,但复用效果更加完美。
拓展:父组件代码块:
import React, { Component } from 'react'
import './App.css';
import Mouse from "../src/component/mousemove/index"
export default class App extends Component {
constructor(){
super();
this.state={
AppX:0,
AppY:0,
adddata:'',
}
}
render() {
return (
<div className="list">
<Mouse>
{
({x,y})=>{
return <img src="https://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=2784038833,1273241182&fm=26&gp=0.jpg" style={{
position:"absolute",
left:x+'px',
top:y+'px'
}}/>
}
}
</Mouse>
</div>
)
}
changeHandler=(x,y)=>{
this.setState({
AppX:x,
AppY:y
})
}
}