Vue 特性

模板语法

  • 支持插值(暂不支持v-html)
  • 支持 v- 指令(某些修饰符不支持,参考指令文档)
  • 支持缩写

build@0.2.13 core@0.2.7 起支持过滤器(filters)和复杂表达式(包括函数调用),之前的版本只支持 swan 支持的表达式

为了区分简单表达式,使用复杂表达式需要在表达式最外层加上 (),如下示例。

filters 可以在插值和 props 中使用,复杂表达式可以在插值、props、v-if、v-else-if、v-for 中使用。

{{( Math.random() )}}  // => 0.21836891324389485
{{ btnText | capitalize}}

<view l="0,2,0" :test="reverse(btnText) | capitalize">

<view v-if="(Math.random() > 0.5)">v-if="Math.random() > 0.5"</view>
<view v-else-if="(Math.random() > 0.5)">v-else-if="(Math.random() > 0.5)"</view>
<view v-else>v-else</view>

<view v-for="item in (split(btnText))">{{item}}</view>

计算属性

  • 支持

为了实现计算属性的初始值能应用到组件初次渲染(否则可能会导致视图闪动),计算属性的初始值会通过 props 方式从 Page 传给组件。为了性能注意不要通过计算属性返回大量数据。

Class 和 Style 绑定

  • 部分支持(不支持 classObject 和 styleObject),见示例
<view class="static" :class="{ active: isActive, 'text-danger': hasError }"></view>
<view class="static" :class="[{ active: isActive }, errorClass]"></view>
<view :style="{ color: activeColor, fontSize: fontSize + 'px' }" style="text-align: center"></view>
<view :style="[{ color: activeColor, fontSize: fontSize + 'px' }, {textAlign: 'center'}]"></view>

条件渲染

  • 支持 v-if
  • 支持 v-show
  • 注意:小程序内用 <block> 来表示不可见的虚拟包裹元素,在 <template> 上使用 v-if 需要使用小程序的 <block> 标签

列表渲染

  • 支持 v-for (暂不支持对象的 v-for 和一段取值范围的 v-for)
  • 注意:小程序内用 <block> 来表示不可见的虚拟包裹元素,在 <template> 上使用 v-for 需要使用小程序的 <block> 标签
  • 注意:由于小程序视图模板限制 v-if 与 v-for 不能同时用于同一节点,需自行处理)

build@0.2.50 起支持可选将 v-for 上的 key 编译为 swan 的 trackBy,开启方法为在 v-for 节点上加上 use-trackby 属性。

事件处理

  • 支持(事件名使用小程序事件名,如 @tap)
  • 支持内联调用方法并绑定参数(注意:参数绑定实际上是通过 dataset 实现,调用时取到的参数是经过序列化的值,而不是原参数的引用;参数暂时只支持传单个值,暂不支持传对象和数组字面量)
  • 修饰符暂只支持.stop

表单输入绑定

  • 支持 v-model

自定义组件

  • data:需要是函数(注意:不支持在 data 中获取 props 的值作为初始值,首次渲染会获取不到)
  • props:支持
  • slot:支持
  • scoped-slot:部分支持(基于 v2.5.21 语法,swan 和 H5 支持,wx 平台暂不支持)
  • 自定义事件:支持
  • refs:支持通过 refs 访问组件实例(暂不支持 refs 访问视图元素)
  • 动态组件 & 异步组件:不支持
  • 注意:由于小程序组件渲染不能在渲染时设置数据,目前只有 data 函数返回的默认值/props的值/此时计算出的计算属性值 作用于组件的首次渲染,其他的数据更新都会在组件首次渲染完成后再更新

可复用性 & 组合

  • 过滤器:支持
  • mixin:暂不支持(计划中)
  • 插件、自定义指令、渲染函数、JSX:不支持

build@0.2.12 core@0.2.6 起支持过滤器(filters),暂时只支持局部定义过滤器。

Vuex

Mars 中使用 Vuex 的方法与 Vue 类似,首先在 app.vue 中引入 Vue 和 Vuex,并初始化:

由于 Mars 使用定制的 Vue ,因此务必从 @marsjs/core 中引入 Vue

import {Vue} from '@marsjs/core';
import Vuex from 'vuex';

Vue.use(Vuex);

之后创建一个 store:

const store = new Vuex.Store({
    state: {
        count: 0
    },
    mutations: {
        increment(state) {
            state.count++;
        }

    }
});

放在 app.vue 的 export 中:

export default {
    config: {
        pages: [
            'pages/home/index',
            'pages/land/index',
            'pages/swan/index.swan'
        ],
        tabBar: {
            list: [{
                pagePath: 'pages/home/index',
                text: 'API'
            }, {
                pagePath: 'pages/land/index',
                text: 'Component'
            }, {
                pagePath: 'pages/swan/index.swan',
                text: 'Swan'
            }]
        },
        window: {
            navigationBarBackgroundColor: '#3eaf7c',
            navigationBarTextStyle: 'white'
        },
        networkTimeout: {
            request: 30000
        }
    },
    store,
    onLaunch() {},
    onShow() {}
};

完成,接下来就可以正常使用 vuex 了。