温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

React之组件的示例分析

发布时间:2021-09-03 10:54:01 来源:亿速云 阅读:164 作者:小新 栏目:web开发

小编给大家分享一下React之组件的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

一、分割 render 函数

当一个组件渲染的内容较多时,有一个快速并且通用的方法是创建sub-render函数来简化原来庞大的 render

class Panel extends React.Component {  renderHeading() {  // ...  }  renderBody() {  // ...  }  render() {  return (  <div>  {this.renderHeading()}  {this.renderBody()}  </div>  );  } }

为了再次简化sub-render函数,我们还可以采用Functional Components写法,这种方式生成了更小的处理单元,且更有利于测试

const PanelHeader = (props) => (  // ... ); const PanelBody = (props) => (  // ... ); class Panel extends React.Component {  render() {  return (  <div>  // Nice and explicit about which props are used  <PanelHeader title={this.props.title}/>  <PanelBody content={this.props.content}/>  </div>  );  } }

二、用 props 传递元素

如果一个组件的状态或配置较多,我们可以运用props传递元素而不仅是数据,比如再声明一个组件,使其中的父组件只专注于配置

class CommentTemplate extends React.Component {  static propTypes = {  // Declare slots as type node  metadata: PropTypes.node,  actions: PropTypes.node,  };  render() {  return (  <div>  <CommentHeading>   <Avatar user={...}/>   // Slot for metadata   <span>{this.props.metadata}</span>  </CommentHeading>  <CommentBody/>  <CommentFooter>   <Timestamp time={...}/>   // Slot for actions   <span>{this.props.actions}</span>  </CommentFooter>  </div>  );  } }

父组件

class Comment extends React.Component {  render() {  const metadata = this.props.publishTime ?  <PublishTime time={this.props.publishTime} /> :  <span>Saving...</span>;  const actions = [];  if (this.props.isSignedIn) {  actions.push(<LikeAction />);  actions.push(<ReplyAction />);  }  if (this.props.isAuthor) {  actions.push(<DeleteAction />);  }  return <CommentTemplate metadata={metadata} actions={actions} />;  } }

三、使用高阶组件

实现点击某组件的超链接,发送该组件的 ID,我们大多的解决方法可能如下

class Document extends React.Component {  componentDidMount() {  ReactDOM.findDOMNode(this).addEventListener('click', this.onClick);  }  componentWillUnmount() {  ReactDOM.findDOMNode(this).removeEventListener('click', this.onClick);  }  onClick = (e) => {  if (e.target.tagName === 'A') { // Naive check for <a> elements  sendAnalytics('link clicked', {  documentId: this.props.documentId // Specific information to be sent  });  }  };  render() {  // ...  } }

然而它却存在代码不能复用,组件重构困难等问题

我们可以使用高阶组件来解决这些问题,顾名思义,高阶组件就是一个函数,传给它一个组件,它返回一个新的组件

function withLinkAnalytics(mapPropsToData, WrappedComponent) {  class LinkAnalyticsWrapper extends React.Component {  componentDidMount() {  ReactDOM.findDOMNode(this).addEventListener('click', this.onClick);  }  componentWillUnmount() {  ReactDOM.findDOMNode(this).removeEventListener('click', this.onClick);  }  onClick = (e) => {  if (e.target.tagName === 'A') { // Naive check for <a> elements  const data = mapPropsToData ? mapPropsToData(this.props) : {};  sendAnalytics('link clicked', data);  }  };  render() {  // Simply render the WrappedComponent with all props  return <WrappedComponent {...this.props} />;  }  }  return LinkAnalyticsWrapper; }

简化代码如下

class Document extends React.Component {  render() {  // ...  } } export default withLinkAnalytics((props) => ({  documentId: props.documentId }), Document);

以上是“React之组件的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI