前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >react es6+ 代码优化之路-1

react es6+ 代码优化之路-1

作者头像
西南_张家辉
发布2021-02-02 10:02:20
2520
发布2021-02-02 10:02:20
举报
文章被收录于专栏:张家辉的树屋

这里集合了一些代码优化的小技巧

  • 在初步接触 es6+ 和 react 的时候总结的一些让代码跟加简化和可读性更高的写法
  • 大部分知识点是自己在平时项目中还不知道总结的,一致的很多优化的点没有写出来,逐步增加中,目的是使用最少的代码,高效的解决问题
  • 有什么更好的方法和不足之处,欢迎大家指出。

react es6+ 代码优化之路-1

1、函数式默认参数

  • 使用函数默认的参数, 使用 es6+ 的时候,有了结构赋值,我们就不用再函数中自己再去定义一个变量。
代码语言:javascript
复制
/*
    当我们使用 es5 的时候
**/
var es5Fun = function (config) {
    var foo = config || 'default foo'
    console.log(foo)
}

//我们传一个对象进去
es5Fun() // 'default foo'
es5Fun('not default foo') // 'not default foo'

/*
    当我们使用 es6+ 的时候
**/
const es6Fun = (config = {'defalut'})=>{
    console.log(config)
}

es6Fun(); // 'defalut'
es6Fun('not defalut') // 'not defalut'
复制代码

1.1 简洁的数组解构

代码语言:javascript
复制
//bad
const splitLocale = locale.split('-');
const language = splitLocale[0];
const country = splitLocale[1];

//good
const [language, country] = locale.split('-');

2、函数命名,布尔变量和返回布尔值的函数应该以is,has,should开头

代码语言:javascript
复制
//bad 
const good = current => goal;

//good
const isGood = current => goal;
复制代码

3、别重复自己的代码

  • 明显可以复用的直接使用组件来套用
代码语言:javascript
复制
//bad
const MyComponent = () => (
  
    
        
  
);

//good
const MyOtherComponent = ({ type }) => (
  
);
const MyComponent = () => (
  
    
    
  
);
复制代码

3.1、函数和组件传值的复用

  • 当我们开始创建了一个组件 Thingie,到后面我们增加了一个需求,需要随时添加一个 title,所以我们又写了一个组件 ThingieWithTitle。这明显可以复用,下面看一下怎么去复用这个组件在 react 中。
代码语言:javascript
复制
//bad
import Title from './Title';

export const Thingie = ({ description }) => (
  
    
      
    
  
);

export const ThingieWithTitle = ({ title, description }) => (
  
    
    <div class="description-wrapper">
      <Description value={description} />
    </div>
  </div>
);
<span class="copy-code-btn">复制代码</span></code></pre><ul>
<li>在这里,我们将 children 传递给 Thingie。然后创建 ThingieWithTitle,这个组件包含 Thingie,并将 Title 作为其子组件传给 Thingie。这样我们就可以分离的使用两个组件,相互不影响,耦合度小。</li>
</ul>
<pre><code class="hljs javascript copyable" lang="javascript"><span class="hljs-comment">//good</span>
<span class="hljs-keyword">import</span> Title <span class="hljs-keyword">from</span> <span class="hljs-string">'./Title'</span>;

<span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> Thingie = <span class="hljs-function">(<span class="hljs-params">{ description, children }</span>) =></span> (
  <div class="thingie">
    {children}
    <div class="description-wrapper">
      <Description value={description} />
    </div>
  </div>
);

export const ThingieWithTitle = ({ title, ...others }) => (
  <Thingie {...others}>
    <Title value={title} />
  </Thingie>
);
<span class="copy-code-btn">复制代码</span></code></pre><h3 class="heading" data-id="heading-7">4、多使用无状态组件</h3>
<ul>
<li>从渲染分离有状态的部分</li>
</ul>
<pre><code class="hljs javascript copyable" lang="javascript"><span class="hljs-comment">//bad</span>
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">User</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Component</span> </span>{
  state = { <span class="hljs-attr">loading</span>: <span class="hljs-literal">true</span> };

  render() {
    <span class="hljs-keyword">const</span> { loading, user } = <span class="hljs-keyword">this</span>.state;
    <span class="hljs-keyword">return</span> loading
      ? <span class="xml"><span class="hljs-tag"><<span class="hljs-name">div</span>></span>Loading...<span class="hljs-tag"></<span class="hljs-name">div</span>></span></span>
      : <span class="xml"><span class="hljs-tag"><<span class="hljs-name">div</span>></span>
          <span class="hljs-tag"><<span class="hljs-name">div</span>></span>
            First name: {user.firstName}
          <span class="hljs-tag"></<span class="hljs-name">div</span>></span>
          <span class="hljs-tag"><<span class="hljs-name">div</span>></span>
            First name: {user.lastName}
          <span class="hljs-tag"></<span class="hljs-name">div</span>></span>
          ...
        <span class="hljs-tag"></<span class="hljs-name">div</span>></span></span>;
  }

  componentDidMount() {
    fetchUser(<span class="hljs-keyword">this</span>.props.id)
      .then(<span class="hljs-function">(<span class="hljs-params">user</span>) =></span> { <span class="hljs-keyword">this</span>.setState({ <span class="hljs-attr">loading</span>: <span class="hljs-literal">false</span>, user })})
  }
}

<span class="hljs-comment">//good</span>
<span class="hljs-comment">//我们把无状态的组件写进 <Renderuser /> 中</span>
<span class="hljs-keyword">import</span> RenderUser <span class="hljs-keyword">from</span> <span class="hljs-string">'./RenderUser'</span>;

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">User</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Component</span> </span>{
  state = { <span class="hljs-attr">loading</span>: <span class="hljs-literal">true</span> };

  render() {
    <span class="hljs-keyword">const</span> { loading, user } = <span class="hljs-keyword">this</span>.state;
    <span class="hljs-keyword">return</span> loading ? <Loading /> : <RenderUser user={user} />;
  }

  componentDidMount() {
    fetchUser(this.props.id)
      .then(user => { this.setState({ loading: false, user })})
  }
}

//anohter good
class User extends Component {
  state = { loading: true };

  _render(){
      return (
        
      )
  }

  render() {
    const { loading, user } = this.state;
    return loading ? <Loading /> : <RenderUser user={user} />;
  }

  componentDidMount() {
    fetchUser(this.props.id)
      .then(user => { this.setState({ loading: false, user })})
  }
}
<span class="copy-code-btn">复制代码</span></code></pre><h3 class="heading" data-id="heading-8">x、使用高阶组件重构代码</h3>
<ul>
<li>未完待续</li>
</ul>
</div> <div class="image-viewer-box" data-v-78c9b824=""><!----></div>
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • react es6+ 代码优化之路-1
    • 1、函数式默认参数
      • 1.1 简洁的数组解构
        • 2、函数命名,布尔变量和返回布尔值的函数应该以is,has,should开头
          • 3、别重复自己的代码
            • 3.1、函数和组件传值的复用
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档