javascript - 如何在 React 中访问 DOM 元素? React 中 document.getElementById() 的等价物是什么

标签 javascript reactjs getelementbyid

我如何在 react.js 中选择某些栏?

这是我的代码:

var Progressbar = React.createClass({
    getInitialState: function () {
        return { completed: this.props.completed };
    },
    addPrecent: function (value) {
        this.props.completed += value;
        this.setState({ completed: this.props.completed });
    },

    render: function () {

        var completed = this.props.completed;
        if (completed < 0) { completed = 0 };


        return (...);
    }

我想使用这个 React 组件:

var App = React.createClass({
    getInitialState: function () {

        return { baction: 'Progress1' };
    },
    handleChange: function (e) {
        var value = e.target.value;
        console.log(value);
        this.setState({ baction: value });
    },
    handleClick10: function (e) {
        console.log('You clicked: ', this.state.baction);
        document.getElementById(this.state.baction).addPrecent(10);
    },
    render: function () {
        return (
            <div class="center">Progress Bars Demo
            <Progressbar completed={25} id="Progress1" />
                <h2 class="center"></h2>
                <Progressbar completed={50} id="Progress2" />
                <h2 class="center"></h2>
                <Progressbar completed={75} id="Progress3" />
                <h2 class="center"></h2>
                <span>
                    <select name='selectbar' id='selectbar' value={this.state.baction} onChange={this.handleChange}>
                        <option value="Progress1">#Progress1</option>
                        <option value="Progress2">#Progress2</option>
                        <option value="Progress3">#Progress3</option>
                    </select>
                    <input type="button" onClick={this.handleClick10} value="+10" />
                    <button>+25</button>
                    <button>-10</button>
                    <button>-25</button>
                </span>
            </div>
        )
    }
});

我想执行 handleClick10 函数并对我选择的进度条执行操作。 但我得到的结果是:

 You clicked:  Progress1
 TypeError: document.getElementById(...) is null

如何在react.js中选中某个Element?

最佳答案

您可以通过指定 ref

来做到这一点

编辑:在带有函数组件的 react v16.8.0 中,您可以使用 useRef 定义一个 ref。请注意,当您在功能组件上指定 ref 时,您需要在其上使用 React.forwardRef 将 ref 转发到使用 useImperativeHandle 的 DOM 元素,以从功能组件中公开某些功能

例如:

const Child1 = React.forwardRef((props, ref) => {
    return <div ref={ref}>Child1</div> 
});

const Child2 = React.forwardRef((props, ref) => {
    const handleClick= () =>{};
    useImperativeHandle(ref,() => ({
       handleClick
    }))
    return <div>Child2</div> 
});
const App = () => {
    const child1 = useRef(null);
    const child2 = useRef(null);

    return (
        <>
           <Child1 ref={child1} />
           <Child1 ref={child1} />
        </>
    )
}

编辑:

React 16.3+ 中,使用 React.createRef() 创建您的 ref:

class MyComponent extends React.Component {
  constructor(props) {
    super(props);
    this.myRef = React.createRef();
  }
  render() {
    return <div ref={this.myRef} />;
  }
}

为了访问元素,使用:

const node = this.myRef.current;

DOC for using React.createRef()


编辑

但是 facebook 建议不要这样做,因为字符串引用有一些问题,被认为是遗留的,并且可能会在未来的某个版本中被删除。

来自文档:

Legacy API: String Refs

If you worked with React before, you might be familiar with an older API where the ref attribute is a string, like "textInput", and the DOM node is accessed as this.refs.textInput. We advise against it because string refs have some issues, are considered legacy, and are likely to be removed in one of the future releases. If you're currently using this.refs.textInput to access refs, we recommend the callback pattern instead.

React 16.2 及更早版本的推荐方法是使用回调模式:

<Progressbar completed={25} id="Progress1" ref={(input) => {this.Progress[0] = input }}/>

<h2 class="center"></h2>

<Progressbar completed={50} id="Progress2" ref={(input) => {this.Progress[1] = input }}/>

  <h2 class="center"></h2>

<Progressbar completed={75} id="Progress3" ref={(input) => {this.Progress[2] = input }}/>

DOC for using callback


甚至旧版本的 React 也使用如下字符串定义 refs

<Progressbar completed={25} id="Progress1" ref="Progress1"/>

    <h2 class="center"></h2>

    <Progressbar completed={50} id="Progress2" ref="Progress2"/>

      <h2 class="center"></h2>

    <Progressbar completed={75} id="Progress3" ref="Progress3"/>

为了得到元素就这样做

var object = this.refs.Progress1;

请记住在箭头功能 block 内使用 this,例如:

print = () => {
  var object = this.refs.Progress1;  
}

等等……

关于javascript - 如何在 React 中访问 DOM 元素? React 中 document.getElementById() 的等价物是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38093760/

相关文章:

javascript - 可以使用 Pushwoosh Remote API + Phonegap 发送基于 GeoZones 的推送

javascript - React/Redux - 何时使用状态和 Prop /何时更改 Prop

javascript - 分派(dispatch)操作时 Redux 状态发生变化

javascript - 如何根据具有多个类的类返回一个元素

javascript - (function() { document.getElementById() == null; })();

javascript - 如何比较 Handlebars 中的值?

javascript - jQuery根据输入数字计算总金额

javascript - document.getElementById(somevar)不工作

javascript - 如何在 Angular JS 中 ng-submit 后隐藏表单

reactjs - 如何在react-multi-carousel中将图像居中?