ClipboardJS 与 React,使用 document.getElementById()
ClipboardJS with React, using document.getElementById()
最初,我让它运行良好。
然后我做了这个,现在我无法让它工作
ClipboardField.js
import React from 'react';
export default (props) => {
return(
<div id="clip" data-clipboard-text={props.code} onClick={props.onClick}>
<p> Copy to clipboard.</p>
</div>
);
}
Field.js
class DashWizardTwoCore extends Component {
componentDidMount(){
const btns = document.getElementById('clip');
const clipboard = new Clipboard(btns);
}
componentDidUpdate() {
clipboard.on('success', function(e) {
console.log(e);
});
clipboard.on('error', function(e) {
console.log(e);
});
}
render(){
const someCode = "const foo = 1"
return (
<div>
<ClipboardField code={this.someCode} /> }
</div>
);
}
}
如果您将代码从 ClipboardField 中取出并放入 Field 中,它就可以工作。主要是,如何在我的 parent 组件中使用 document.getElementById() 来在我的 child 中查找内容?
他们的例子:
https://github.com/zenorocha/clipboard.js/blob/master/demo/constructor-selector.html#L18
https://github.com/zenorocha/clipboard.js/blob/master/demo/constructor-node.html#L16-L17
https://github.com/zenorocha/clipboard.js/blob/master/demo/constructor-nodelist.html#L18-L19
我调整了您的代码并创建了 clipboard.js
与 React 的简单集成。
这是 fiddle:https://jsfiddle.net/mrlew/ehrbvkc1/13/。看看吧。
您的代码很好,只是有几个问题:
- 您正在
componentDidUpdate
中绑定 clipboard.on
,这不会在此处触发,因为您并没有真正更改触发此事件的任何内容(在 ClipboardField
组件中)。
- 您在
code
属性中传递 {this.someCode}
未定义应该只是 {someCode}
所以只需将 clipboard.on
移动到 new Clipboard
之后的 componentDidMount
并使用 code={someCode}
https://jsfiddle.net/yy8cybLq/
--
在 React 中,每当您想访问组件的实际 dom 元素时,我们使用 react 调用作为引用,我建议您这样做而不是使用 getElementById
,因为这是 "best practice".
但是无状态组件(比如上面的 ClipboardField
组件)不能有 refs,因此您只需要将其更改为普通组件即可。
这是一个 fiddle 与您的代码,但使用 refs 代替:https://jsfiddle.net/e5wqk2a2/
我尝试包括指向无状态组件和引用的反应文档的链接,但显然没有足够的 "rep" 到 post 超过 2 个链接,无论如何快速 google 搜索应该为您指明正确的方向。
最初,我让它运行良好。
然后我做了这个,现在我无法让它工作
ClipboardField.js
import React from 'react';
export default (props) => {
return(
<div id="clip" data-clipboard-text={props.code} onClick={props.onClick}>
<p> Copy to clipboard.</p>
</div>
);
}
Field.js
class DashWizardTwoCore extends Component {
componentDidMount(){
const btns = document.getElementById('clip');
const clipboard = new Clipboard(btns);
}
componentDidUpdate() {
clipboard.on('success', function(e) {
console.log(e);
});
clipboard.on('error', function(e) {
console.log(e);
});
}
render(){
const someCode = "const foo = 1"
return (
<div>
<ClipboardField code={this.someCode} /> }
</div>
);
}
}
如果您将代码从 ClipboardField 中取出并放入 Field 中,它就可以工作。主要是,如何在我的 parent 组件中使用 document.getElementById() 来在我的 child 中查找内容?
他们的例子:
https://github.com/zenorocha/clipboard.js/blob/master/demo/constructor-selector.html#L18
https://github.com/zenorocha/clipboard.js/blob/master/demo/constructor-node.html#L16-L17
https://github.com/zenorocha/clipboard.js/blob/master/demo/constructor-nodelist.html#L18-L19
我调整了您的代码并创建了 clipboard.js
与 React 的简单集成。
这是 fiddle:https://jsfiddle.net/mrlew/ehrbvkc1/13/。看看吧。
您的代码很好,只是有几个问题:
- 您正在
componentDidUpdate
中绑定clipboard.on
,这不会在此处触发,因为您并没有真正更改触发此事件的任何内容(在ClipboardField
组件中)。 - 您在
code
属性中传递{this.someCode}
未定义应该只是{someCode}
所以只需将 clipboard.on
移动到 new Clipboard
之后的 componentDidMount
并使用 code={someCode}
https://jsfiddle.net/yy8cybLq/
--
在 React 中,每当您想访问组件的实际 dom 元素时,我们使用 react 调用作为引用,我建议您这样做而不是使用 getElementById
,因为这是 "best practice".
但是无状态组件(比如上面的 ClipboardField
组件)不能有 refs,因此您只需要将其更改为普通组件即可。
这是一个 fiddle 与您的代码,但使用 refs 代替:https://jsfiddle.net/e5wqk2a2/
我尝试包括指向无状态组件和引用的反应文档的链接,但显然没有足够的 "rep" 到 post 超过 2 个链接,无论如何快速 google 搜索应该为您指明正确的方向。