script域扩展

在原生自定义组件config的基础上,mpx新增支持了watch、computed、mixins、pageShow & pageHide等字段提高开发体验,同时mpx提供一个深度优化的机制来接管小程序的setData调用,用户在组件/页面当中可以使用this.someData = 'abc'的方式来设置数据,永远不应该直接调用setData去设置数据,这有可能导致数据不一致的问题。

computed

计算属性是一个纯函数,利用组合其它数据的方式返回一个新的数据,你可以像绑定普通数据一样在模板中绑定计算属性。

适用于【页面 | 组件】

示例:

  1. <template>
  2. <view>
  3. <text>Original message: "{{ message }}"</text>
  4. <text>Computed reversed message: "{{ reversedMessage }}"</text>
  5. </view>
  6. </template>
  7. <script>
  8. import {createComponent} from '@mpxjs/core'
  9. createComponent({
  10. data: {
  11. message: 'Hello'
  12. },
  13. computed: {
  14. // 计算属性
  15. reversedMessage: function () {
  16. return this.message.split('').reverse().join('')
  17. }
  18. },
  19. ready() {
  20. // 改变message后reversedMessage会同步更新,模板也会重新渲染
  21. this.message = 'Hello world!'
  22. }
  23. })
  24. </script>

watch

mpx为小程序原生组件提供了观察和响应上的数据变动的能力。虽然计算属性在大多数情况下已满足需求,但有时也需要一个自定义的侦听器。当需要在数据变化时执行异步或开销较大的操作时,这个方式是最有用的。

适用于【页面 | 组件】

例如:

  1. <template>
  2. <view>
  3. <view>{{question}}</view>
  4. <view>{{answer}}</view>
  5. </view>
  6. </template>
  7. <script>
  8. import {createComponent} from '@mpxjs/core'
  9. createComponent({
  10. data: {
  11. question: 'old',
  12. answer: 'I cannot give you an answer until you ask a question!'
  13. },
  14. watch: {
  15. // 如果 `question` 发生改变,这个函数就会运行
  16. question: function (newval, oldval) {
  17. console.log(newval, ':', oldval) // test:old
  18. this.answer = 'Waiting for you to stop typing...'
  19. }
  20. },
  21. attached () {
  22. // 3s之后修改数据
  23. setTimeout(() => {
  24. this.changeData()
  25. }, 3000)
  26. },
  27. methods: {
  28. changeData() {
  29. this.question = 'test'
  30. }
  31. }
  32. })
  33. </script>

除了 watch 选项之外,您还可以使用命令式的 this.$watch API。

mixins

mixins 选项接受一个混合对象的数组。这些混合实例对象可以像正常的实例对象一样包含选项,他们将使用相同的选项合并逻辑合并。举例:如果你混合包含一个钩子而创建组件本身也有一个,两个函数将被调用。
Mixin 钩子按照传入顺序依次调用,并在调用组件自身的钩子之前被调用。

适用于【APP | 页面 | 组件】

示例:

  1. // mixin.js
  2. export default {
  3. data: {
  4. list: {
  5. 'phone': '手机',
  6. 'tv': '电视',
  7. 'computer': '电脑'
  8. }
  9. },
  10. ready () {
  11. console.log('mixins ready:', this.list.phone)
  12. }
  13. }
  1. <template xmlns="">
  2. <view class="list">
  3. <view wx:for="{{list}}">{{item}}</view>
  4. </view>
  5. </template>
  6. <script>
  7. import {createComponent} from '@mpxjs/core'
  8. import mixin from './mixin'
  9. createComponent({
  10. mixins: [mixin],
  11. ready () {
  12. console.log('component ready:', this.list.tv)
  13. }
  14. })
  15. </script>

输出结果为

  1. mixins ready: 手机
  2. component ready: 电视

页面生命周期

除了小程序自定义组件本身的生命周期外,mpx扩展了两个页面生命周期钩子,pageShowpageHide,用于监听当前所属页面的显示或隐藏状态。

适用于【组件】

  1. <template>
  2. <view>组件新生命周期</view>
  3. </template>
  4. <script>
  5. import {createComponent} from '@mpxjs/core'
  6. createComponent({
  7. pageShow () {
  8. // 所在页面显示之后就会执行一次
  9. console.log('page show')
  10. },
  11. pageHide () {
  12. // 页面切入后台执行
  13. console.log('page hide')
  14. }
  15. })
  16. </script>