为了从子组件执行功能, 你将需要使用引用。 React支持一个特殊属性, 你可以将其附加到任何组件, 即ref属性, 它具有回调函数, 并且你可以通过访问this.refs.REF_NAME.METHOD_NAME来访问父组件中子组件的功能。
【如何在React中从父组件执行子组件功能】我们将创建一个Parent元素, 它将呈现一个<
Child />
组件。如你所见, 将要渲染的组件需要添加ref属性并为其提供名称。然后, 位于父类中的triggerChildAlert函数将访问此上下文的refs属性(当触发triggerChildAlert函数将访问子引用时, 它将具有子元素的所有功能)。
class Parent extends React.Component {triggerChildAlert(){this.refs.child.showAlert();
}render() {return (<
div>
{/* Note that you need to give a value to the ref parameter, in this case child*/}<
Child ref="child" />
<
button onClick={this.triggerChildAlert}>
Click<
/button>
<
/div>
);
}}
现在, 按照先前的理论设计, 子组件将如下所示:
class Child extends React.Component {showAlert() {alert('Hello World');
}render() {return (<
h1>
Hello<
/h1>
);
}}
showAlert方法是唯一可在父组件的this.refs.child中使用的方法。
例子如果你对上一个示例不太了解, 则可以分析以下实现。在此示例中, 我们将使用material-ui及其两个组件, 即抽屉和按钮。自定义抽屉将位于一个额外的文件Drawer.js中:
// Drawer.jsimport React from 'react';
import Drawer from 'material-ui/Drawer';
import MenuItem from 'material-ui/MenuItem';
export default class DrawerMain extends React.Component {constructor(props) {super(props);
this.state = {open: false};
}// Shows or hide the DrawerhandleToggle = () =>
this.setState({open: !this.state.open});
// Closes the drawerhandleClose = () =>
this.setState({open: false});
render() {return (<
div>
<
Drawerdocked={false}width={200}open={this.state.open}onRequestChange={(open) =>
this.setState({open})}>
<
MenuItem onTouchTap={this.handleClose}>
Menu Item<
/MenuItem>
<
MenuItem onTouchTap={this.handleClose}>
Menu Item 2<
/MenuItem>
<
/Drawer>
<
/div>
);
}}
没什么特别我们需要注意的, handleToggle方法仅可在Drawer组件中使用, 但是由于我们不会在< Drawer /> 组件内添加任何按钮, 因此我们需要某种方式访问??这些方法, 否则我们将无法不要使用抽屉。因此, 在< / Main> 组件中, 我们将添加一个简单的按钮, 该按钮将显示抽屉并访问< Drawer /> 组件中的handleToggle方法:
import React, {Component} from 'react';
import getMuiTheme from 'material-ui/styles/getMuiTheme';
import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider';
import FloatingActionButton from 'material-ui/FloatingActionButton';
import ContentAdd from 'material-ui/svg-icons/image/add-a-photo';
// Import the drawer component previously created as DrawerMainimport DrawerMain from './Drawer';
class Main extends Component {constructor(props, context) {super(props, context);
} handleDrawer = () =>
{// Access the handleToggle function of the drawer referencethis.refs.customDrawerReference.handleToggle();
} render() {return (<
MuiThemeProvider muiTheme={muiTheme}>
<
div>
{/* Add the Drawer and create the "drawer" reference */}<
DrawerMain ref="customDrawerReference"/>
{/* The button that will open the drawer onTouchTap (click or whatever) */}<
FloatingActionButton style={style} onTouchTap={this.handleDrawer}>
<
ContentAdd />
<
/FloatingActionButton>
<
/div>
<
/MuiThemeProvider>
);
}}export default Main;
如果你想要有关ref属性的更多信息, 请在此处阅读官方文档。编码愉快!
推荐阅读
- 如何使用jQuery将YouTube视频用作页面背景
- 如何通过jQuery UI Touch Punch在移动(触摸)设备上使用jQuery UI功能
- 如何在React中从子组件更新父状态
- 使用(或不使用)jQuery在你的网站中实现智能应用横幅
- 「首度揭秘」大规模HPC生产环境 IO 特征
- 是的你没看错,HTTP3来了
- Redis 系列redis 学习,redis 的哨兵模式详解和实战
- 在CentOS 8上安装 KVM / QEMU 进行虚拟化
- XGBoost feature importance特征重要性-实战印第安人糖尿病数据集(附代码)