Reactjs 材料界面';s withTheme()对ref prop隐藏组件
对于React中很少需要引用另一个JSX元素的情况,可以使用Reactjs 材料界面';s withTheme()对ref prop隐藏组件,reactjs,material-ui,Reactjs,Material Ui,对于React中很少需要引用另一个JSX元素的情况,可以使用refprop,如下所示: class Widget extends React.PureComponent { example() { // do something } render() { ... <Widget ref={r => this.mywidget = r}/> <OtherWidget onClick={e => this.mywidget.example()}/&
ref
prop,如下所示:
class Widget extends React.PureComponent {
example() {
// do something
}
render() {
...
<Widget ref={r => this.mywidget = r}/>
<OtherWidget onClick={e => this.mywidget.example()}/>
但是,如果完成此操作,ref
将接收带有主题的实例,而不是小部件
。这意味着不再可以访问example()
函数
是否有某种方法可以将ref
与withTheme()
包装的组件一起使用,以便仍然可以访问底层对象,就像没有使用withTheme()
一样
下面是一个例子来说明这个问题。可以对第27行和第28行进行注释/取消注释,以查看只有在添加withTheme()
调用时才会失败
为了获得使用withStyles包装的组件的ref,您可以在小部件周围创建一个包装器,并将其与withStyles一起使用
const WithRefWidget = ({ innerRef, ...rest }) => {
console.log(innerRef);
return <Widget ref={innerRef} {...rest} />;
};
const MyWidget = withTheme()(WithRefWidget);
class Demo extends React.PureComponent {
constructor(props) {
super(props);
this.mywidget = null;
}
render() {
return (
<React.Fragment>
<MyWidget
innerRef={r => {
console.log(r);
this.mywidget = r;
}}
/>
<Button
onClick={e => {
e.preventDefault();
console.log(this.mywidget);
}}
variant="raised"
>
Click
</Button>
</React.Fragment>
);
}
}
constwithrefwidget=({innerRef,…rest})=>{
console.log(innerRef);
返回;
};
const MyWidget=withTheme()(WithRefWidget);
类Demo扩展了React.PureComponent{
建造师(道具){
超级(道具);
this.mywidget=null;
}
render(){
返回(
{
控制台日志(r);
this.mywidget=r;
}}
/>
{
e、 预防默认值();
log(this.mywidget);
}}
variant=“提高”
>
点击
);
}
}
看看这个答案,看看其他的替代方法
根据Shubham Khatri的回答,这是一个较短的备选方案。当您不能修改内部组件时,这个答案就起作用了。当您可以修改内部组件时,这个示例稍微简短一些
本质上,ref
不会通过withTheme()
传递,因此您必须使用具有不同名称的道具,并自己在其上实现ref
功能:
class Widget extends React.PureComponent {
constructor(props) {
props.ref2(this); // duplicate 'ref' functionality for the 'ref2' prop
...
const MyWidget = withTheme()(Widget);
...
<MyWidget
ref2={r => {
console.log(r);
this.mywidget = r;
}}
/>
类小部件扩展了React.PureComponent{
建造师(道具){
props.ref2(this);//为'ref2'道具复制'ref'功能
...
const MyWidget=withTheme()(小部件);
...
{
控制台日志(r);
this.mywidget=r;
}}
/>
class Widget extends React.PureComponent {
constructor(props) {
props.ref2(this); // duplicate 'ref' functionality for the 'ref2' prop
...
const MyWidget = withTheme()(Widget);
...
<MyWidget
ref2={r => {
console.log(r);
this.mywidget = r;
}}
/>