uniapp vs taro3 vue 小程序动态渲染

背景

昨天晚上我花了好长时间想使用 taro 去开发一个小程序,但是我将官方模版带(nutui)拉下来后怎么跑都是跑不起来,搞得我心态爆炸(taro4 有坑,最新的 taro cli 4 也有坑,导致默认模板也有问题,另一个坑就是不要用 pnpm)。

今天我再次尝试跑 taro3 成功运行了,顺便对比 taro3 和 uniapp 对 vue 支持的一些重要特性的细节。

开始

循环渲染动态的组件

数据结构是这样的:

js 复制代码
const data = ref([
  { component: comp1, props: { label: "COMP1" } },
  { component: comp2, props: { label: "COMP2" } }
])

需求是循环渲染 data,并且按照 type 去渲染对应组件,然后将 label 渲染出来。

html 复制代码
<template>
  <view class="demo">
    <component 
      v-for="(item, index) in data" 
      :key="index" 
      :is="item.component" 
      v-bind="item.props" 
    />
  </view>
</template>

<script setup>
import { ref } from "vue";
import comp1 from "../../components/comp1/comp1.vue";
import comp2 from "../../components/comp2/comp2.vue";

const data = ref([
  { component: comp1, props: { label: "COMP1" } },
  { component: comp2, props: { label: "COMP2" } }
])

</script>

<style>
.demo {
  height: 100%;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
}
</style>
Taro 渲染效果 Uniapp 渲染效果

taro3 效果还是不错的,可以正确的渲染,但是 uniapp 直接是不支持这就尴尬了,本来还想继续测试一下其他的特性,看来后面只能测试 taro 了。

渲染渲染动态组件并且使用插槽渲染 label

基于上面的代码我们做一下小的更改:

html 复制代码
<template>
  <view class="demo">
    <component 
      v-for="(item, index) in data" 
      :key="index" 
      :is="item.component" 
      v-bind="item.props" 
    >
    <template #item="{ data }">
      <view style="color: red;">
        Out({{ data }})
      </view>
    </template>
   </component>
  </view>
</template>

<script setup>
import { ref } from "vue";
import comp1 from "../../components/comp1/comp1.vue";
import comp2 from "../../components/comp2/comp2.vue";

const data = ref([
  { component: comp1, props: { label: "COMP1" } },
  { component: comp2, props: { label: "COMP2" } }
])

</script>

<style>
.demo {
  height: 100%;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
}
</style>
Taro 渲染效果

效果很不错也能实现。

动态添加元素渲染尝试

到这一步我已经对 taro3 的印象非常不错了,在小程序实现动态组件渲染是非常难的,没想到 taro3 做的如此之好。

下面我们测试一下动态添加元素是否可以:

html 复制代码
<template>
  <view class="demo">
    <component 
      v-for="(item, index) in data" 
      :key="index" 
      :is="item.component" 
      v-bind="item.props" 
    >
    <template #item="{ data }">
      <view style="color: red;">
        <comp3 :label="data"></comp3>
      </view>
    </template>
   </component>

   <nut-button @tap="onAdd">添加</nut-button>
  </view>
</template>

<script setup>
import { ref } from "vue";
import comp1 from "../../components/comp1/comp1.vue";
import comp2 from "../../components/comp2/comp2.vue";
import comp3 from "../../components/comp3/comp3.vue";

const data = ref([
  { component: comp1, props: { label: "COMP1" } },
  { component: comp2, props: { label: "COMP2" } }
])

function onAdd(e) {
  data.value.push({ component: comp3, props: { label: "COMP1" } })
}

</script>

<style>
.demo {
  height: 100%;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
}
</style>
Taro 渲染效果

效果很 nice 我们成功渲染。

最后

到这里我们就基本可以确定可以使用 taro3 去做小程序开发了,真希望 uniapp 也能支持这些特性,动态组件渲染这个还是非常重要的,在代码抽象方面和传统方式大了一截。

最后项目模版在下面请自行查看,如果您觉得文章有用可以点个赞吗,这对我很重要。

Lydanne/taro-monorepo (github.com)

相关推荐
幻影七幻几秒前
js中send的作用和使用 $.ajax的作用
开发语言·前端·javascript
我是Superman丶39 分钟前
Antigravity Retry 自动重试脚本
前端·javascript·vue.js
im_AMBER1 小时前
Leetcode 162 除了自身以外数组的乘积 | 接雨水
开发语言·javascript·数据结构·算法·leetcode
Komorebi_99992 小时前
前端开发|18 个高频易错知识点汇总(HTML+CSS+JS+Vue)面试 & 开发通用
javascript·css·html
Wenzar_2 小时前
# D3.js实战进阶:从基础图表到交互式数据仪表盘的全流程构建在现代前端开发中,**数据可视化已成为提升用户体验的核心能力之一
java·javascript·python·信息可视化·ux
菜鸟小码2 小时前
MapReduce 编程模型详解:Mapper、Reducer、Driver 三大核心组件
大数据·javascript·mapreduce
林恒smileZAZ3 小时前
CSS 滚动驱动动画(scroll-timeline):无 JS 实现滚动特效
前端·javascript·css
懒人村杂货铺3 小时前
Express + TypeScript 后端通用标准规范
javascript·typescript·express
kyriewen3 小时前
你的数据该在哪儿拿?Next.js三种姿势一次讲清
前端·javascript·next.js
傻啦嘿哟3 小时前
管好PPT的“骨架”:用Python控制页面与文档属性
开发语言·javascript·c#