参考回调和 this.mount - reactJS

Posted

技术标签:

【中文标题】参考回调和 this.mount - reactJS【英文标题】:Ref callbacks & this.mount - reactJS 【发布时间】:2018-09-03 07:53:29 【问题描述】:

我正在阅读这个问题的最佳答案。

How to connect Threejs to React?

有人提供了这个在 react 中使用threejs的好例子:

import React,  Component  from 'react'
import * as THREE from 'three'

class Scene extends Component 
constructor(props) 
super(props)

this.start = this.start.bind(this)
this.stop = this.stop.bind(this)
this.animate = this.animate.bind(this)


componentDidMount() 
const width = this.mount.clientWidth
const height = this.mount.clientHeight

const scene = new THREE.Scene()
const camera = new THREE.PerspectiveCamera(
  75,
  width / height,
  0.1,
  1000
)
const renderer = new THREE.WebGLRenderer( antialias: true )
const geometry = new THREE.BoxGeometry(1, 1, 1)
const material = new THREE.MeshBasicMaterial( color: '#433F81' )
const cube = new THREE.Mesh(geometry, material)

camera.position.z = 4
scene.add(cube)
renderer.setClearColor('#000000')
renderer.setSize(width, height)

this.scene = scene
this.camera = camera
this.renderer = renderer
this.material = material
this.cube = cube

this.mount.appendChild(this.renderer.domElement)
this.start()


componentWillUnmount() 
this.stop()
this.mount.removeChild(this.renderer.domElement)


start() 
if (!this.frameId) 
  this.frameId = requestAnimationFrame(this.animate)



stop() 
  cancelAnimationFrame(this.frameId)


animate() 
this.cube.rotation.x += 0.01
this.cube.rotation.y += 0.01

this.renderScene()
this.frameId = window.requestAnimationFrame(this.animate)


renderScene() 
  this.renderer.render(this.scene, this.camera)


render() 
return (
  <div
    style= width: '400px', height: '400px' 
    ref=(mount) =>  this.mount = mount 
  />
)



export default Scene

我不明白 this.mountthis.mount 是什么?它似乎用于访问客户端宽度和客户端高度。而 ref 回调函数ref=(mount) =&gt; this.mount = mount 是干什么的?

我做了一些研究,发现 ref 回调是在组件挂载后调用的,它们可以用于将状态从父级传递给子级,但只能在必要时使用。我从文档中得到了所有这些。

我计划出于自己的目的修改此脚本,因此了解 this.mount 和 ref 回调将非常有帮助。 TIA

【问题讨论】:

【参考方案1】:

查看文档 - React Refs and the DOM(强调我的):

当在 html 元素上使用 ref 属性时,ref 回调接收底层 DOM 元素作为其参数

所以在:

  render() 
    return (
      <div
        style= width: '400px', height: '400px' 
        ref=(mount) =>  this.mount = mount 
      />
    )
  

this.mount 将持有对组件安装到的实际&lt;div&gt; 的引用。

请务必注意,this.mount 仅在组件安装后 存在。这就是为什么所有使用this.mountis in componentDidMount()或之后的逻辑,只有在组件安装后才会触发:

componentDidMount() 在组件安装后立即调用。需要 DOM 节点的初始化应该放在这里。如果您需要从远程端点加载数据,这是一个实例化网络请求的好地方。

【讨论】:

以上是关于参考回调和 this.mount - reactJS的主要内容,如果未能解决你的问题,请参考以下文章

ReactJS 状态未更新在 setState 回调中

reactjs-回调函数在输入键被按下时仍然没有更新背景颜色

带有 Iframe 事件和更改处理的 ReactJs

需要在不使用 onChange 回调的情况下获取下拉菜单的值 - (material-ui reactjs)

异步设置 ReactJS 状态

从子组件更新父状态在 reactjs 中不起作用