Vue 2.x折腾记 - (20) JSX在业务中的具体实践以及跟React书写的差异化

简介: Vue JSX:让Vue支持JSX来书写代码的一个开发构建依赖。最近已经到1.0 正式版了,稍微梳理下,就落实到具体业务去尝试。更多的姿势可以看上面仓库的README,这里只说说我用到的。


前言


Vue JSX:让Vue支持JSX来书写代码的一个开发构建依赖。


最近已经到1.0 正式版了,稍微梳理下,就落实到具体业务去尝试。


更多的姿势可以看上面仓库的README,这里只说说我用到的。


差异化


这里仅仅列出我写这篇文章时候脑海能回忆起来的


React


写JSX很自然,毕竟是自家倡导的


  • 类名需要做classname
  • props的传递可以直接 {...props}
  • 节点的传递,通过{props.children} 渲染
  • 支持空节点包括同级节点, <><child/><child2/></>
  • 支持花括号直接遍历数组生成节点,{list.map(item=>(<a {...item.props}/>)}
  • 函数式组件支持非常好


Vue


能够支持部分vue独有的特性,比如拿到computed, 指令及自定义事件;


其他的写法上和react差不多,具体一些特性如下:


  • 类名依旧可以直接class,其他对象和数组的支持跟react大同小异
  • props的快速传递需要包括到attrs
  • 若是要快速传递所有父级props,{...{attrs:this.$attrs}}
  • $attrs会汇总除了class和style之外的所有props
  • 节点的传递可以通过slots,比如最常见的具名<div>{this.$slots.default}</div>
  • 传递变量(scope-slots),父用this.$scopedSlots.default这类来传递一个对象
  • 同级节点不支持,必须最外层有包裹层
  • 不支持花括号内直接遍历(我用的时候会报错),单独抽离出一个函数式组件
  • 函数式组件支持模板和js两种写法,简单的用法基本和react一致


代码体现


自定义事件


结合第二个栗子就能串起来


<script>
import png_default_scan_avatar from '@assets/cert/face_cert/scan_avatar.png';
import CertFooter from '../components/CertFooter';
export default {
  components: {
    CertFooter
  },
  name: 'face_cert',
  methods: {
    nextStep(isClick) {
      if (isClick) {
        console.log('11');
      }
      // 下一步验证
      // this.$router.push({ name: 'cert_step4' });
    }
  },
  render() {
    const DefaultScanAvatar = () => {
      return (
        <div class="default-scan-avatar">
          <div class="default-scan-avatar__desrc">请正对手机,确保光线充足</div>
          <img class="default-scan-avatar__img" src={png_default_scan_avatar} />
        </div>
      );
    };
    return (
      <div class="face-cert-page">
        <DefaultScanAvatar />
        <cert-footer text={'开始刷脸'} disabled={false} on-button-click={e => this.nextStep(e)} />
      </div>
    );
  }
};
</script>
<style lang="scss" scoped>
.face-cert-page {
  background-color: #fff;
  height: 100%;
  .default-scan-avatar {
    margin-top: 54px;
    margin-bottom: 148px;
    &__desrc {
      font-size: 36px;
      color: #333;
      text-align: center;
      margin-bottom: 127px;
    }
    &__img {
      display: block;
      height: 350px;
      width: 350px;
      margin: 0 auto;
    }
  }
  .cert-footer {
    .next-wrapper {
      width: 626px;
      margin: 0 auto;
    }
  }
}
</style>


{...props}及slot的体现


<script>
export default {
  name: 'CertFooter',
  methods: {
    btnClick() {
      // 点击了按钮
      this.$emit('button-click', true);
    }
  },
  render() {
    return (
      <div class="cert-footer">
        <div class="cert-footer__btn" onClick={this.btnClick}>
          <ns-button {...{ attrs: this.$attrs }} />
        </div>
        <safe-tips />
        {this.$slots.default}
      </div>
    );
  }
};
</script>
<style lang="scss" scoped>
.cert-footer {
  width: 100%;
  &__btn {
    width: 626px;
    margin: 0 auto;
  }
}
</style>


常规用法


<script>
export default {
  props: {
    cardinfo: {
      type: Object,
      default: function() {
        return {
          title: '银行名字',
          type: '卡类型',
          cardnumber: ['3432', '*****', '*****', '4232']
        };
      }
    },
    defaultCard: {
      type: Boolean,
      default: false
    }
  },
  render() {
    const { cardinfo } = this.$props;
    const CardNumber = ({ props }) => {
      return props.list.map((item, index) => {
        return (
          <div class="bankcard__card--number-field" key={index}>
            {item}
          </div>
        );
      });
    };
    return (
      <div class="bankcard">
        <div class="bankcard__title">
          {cardinfo.title}
          {this.defaultCard ? (
            <div class={['bankcard__btn', 'bankcard__btn--disabled']}>默认</div>
          ) : (
            <div class={['bankcard__btn', 'bankcard__btn--setDefaultCard']} onClick={() => this.$emit('change', true)}>
              设为默认
            </div>
          )}
        </div>
        <div class="bankcard__card--type">{cardinfo.type}</div>
        <div class="bankcard__card--number">
          <CardNumber list={cardinfo.cardnumber} />
        </div>
      </div>
    );
  }
};
</script>
<style lang="scss" scoped>
.bankcard {
  margin: 30px 0;
  background-color: #fff;
  box-shadow: 1px 1px 7px rgba(79, 123, 234, 0.31);
  width: 100%;
  border-radius: 5px;
  padding: 56px 44px;
  .bankcard__title {
    font-size: 36px;
    color: #333;
    @include flex(row, space-between, center);
  }
  .bankcard__btn {
    font-size: 14px;
    color: #333;
    padding: 5px 10px;
    border-radius: 5px;
    cursor: pointer;
    &--disabled {
      background-color: rgba(211, 208, 208, 0.66);
      color: #989393;
    }
    &--setDefaultCard {
      border: 1px solid #989393;
      &:active {
        color: #4f7aea;
        border: 1px solid #4f7aea;
      }
    }
  }
  .bankcard__card--type {
    padding-top: 11px;
    font-size: 25px;
    color: #666;
  }
  .bankcard__card--number {
    margin-top: 50px;
    @include flex(row, flex-start, center);
    cursor: pointer;
    font-size: 36px;
    .bankcard__card--number-field {
      height: 30px;
      line-height: 30px;
      &:not(:first-child) {
        margin-left: 50px;
      }
    }
  }
}
</style>


目录
相关文章
|
10天前
|
XML 前端开发 JavaScript
react之了解jsx
react之了解jsx
|
1月前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
163 2
|
10天前
|
JavaScript 前端开发 容器
React零基础入门02--JSX语法基础
React零基础入门02--JSX语法基础
React零基础入门02--JSX语法基础
|
6天前
|
JavaScript 前端开发 算法
React 框架和 Vue 框架的区别是什么?
React框架和Vue框架都是目前非常流行的前端JavaScript框架,它们在很多方面存在区别
|
19天前
|
前端开发 JavaScript 开发者
React与Vue:前端框架的巅峰对决与选择策略
【10月更文挑战第23天】React与Vue:前端框架的巅峰对决与选择策略
|
22天前
|
前端开发 JavaScript
手敲Webpack 5:React + TypeScript项目脚手架搭建实践
手敲Webpack 5:React + TypeScript项目脚手架搭建实践
|
19天前
|
前端开发 JavaScript 数据管理
React与Vue:两大前端框架的较量与选择策略
【10月更文挑战第23天】React与Vue:两大前端框架的较量与选择策略
|
19天前
|
JavaScript 前端开发 算法
在性能上,React和Vue有什么区别
【10月更文挑战第23天】在性能上,React和Vue有什么区别
15 1
|
24天前
|
JavaScript 前端开发 算法
前端优化之超大数组更新:深入分析Vue/React/Svelte的更新渲染策略
本文对比了 Vue、React 和 Svelte 在数组渲染方面的实现方式和优缺点,探讨了它们与直接操作 DOM 的差异及 Web Components 的实现方式。Vue 通过响应式系统自动管理数据变化,React 利用虚拟 DOM 和 `diffing` 算法优化更新,Svelte 通过编译时优化提升性能。文章还介绍了数组更新的优化策略,如使用 `key`、分片渲染、虚拟滚动等,帮助开发者在处理大型数组时提升性能。总结指出,选择合适的框架应根据项目复杂度和性能需求来决定。
|
27天前
|
XML 前端开发 JavaScript
React JSX
React 使用 JSX(一种类似 XML 的 JavaScript 语法扩展)来替代传统 JavaScript 编写 UI。JSX 使代码更简洁、执行更快且类型安全。例如,`&lt;h1&gt;Hello, world!&lt;/h1&gt;` 实际上是创建一个 React 元素,通过 `ReactDOM.render()` 渲染到 DOM。注意,JSX 中使用 `className` 替代 HTML 的 `class` 属性。