gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 02:38:11 27 4
gpt4 key购买 nike

我如何在 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 befamiliar with an older API where the ref attribute is a string, like"textInput", and the DOM node is accessed as this.refs.textInput. Weadvise against it because string refs have some issues, are consideredlegacy, and are likely to be removed in one of the future releases. Ifyou're currently using this.refs.textInput to access refs, werecommend 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com