无法操纵React组件中的DOM

won*_*rld 5 dom reactjs

我不能操纵<div id="chart">无论是在componentWillMountcomponentDidMount生命周期方法.

document.getElementById("chart")在两个方法中都返回null.我应该不使用原始DOM操作函数,还是应该使用其他东西来实现相同的操作<div id="chart">

import React from 'react'

export default class D3Chart extends React.Component {
    constructor () {
        super();
    }

    componentWillMount() {
         document.getElementById("chart").innerText = "Testing";
    }

    componentDidMount () {
        document.getElementById("chart").innerText = "Testing";
    }

    render() {
            return (<div id="chart"></div>
        )
    };
}
Run Code Online (Sandbox Code Playgroud)

lyo*_*sef 15

就像refReact家伙推荐的那样使用:

import React from 'react';
import ReactDOM from 'react-dom';

export default class D3Chart extends React.Component {
    constructor () {
        super();
    }

    componentDidMount () {
        this.refs.chart.innerText = "Testing";
    }

    render() {
        return <div id="chart" ref="chart"></div>;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是小提琴.


nea*_*sic 5

ref是您访问节点的方式,类似于HTML中的id

this.refs.myDiv;

<div ref='myDiv' />
Run Code Online (Sandbox Code Playgroud)

,keyReact是如何区分相似节点的.方法cloneElement(用于向实例化的JSX模板添加额外的道具)维护这些引用,因此您不必担心"丢失"对象引用.


还有一个更复杂/不同/下一代的光:

当附加[ref]到DOM组件时<div />,您将获得DOM节点; 当附加[ref]到复合组件时<TextInput />,您将获得React类实例.在后一种情况下,如果在其类定义中公开了任何方法,则可以调用该组件上的方法.

render () {
    return (
        <div ref={htmlOrComponent => { this.htmlOrComponent = htmlOrComponent }}
    );
}

componentDidMount () {
    // this.htmlOrComponent is either the HTML or null
}
Run Code Online (Sandbox Code Playgroud)