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. info: {
  14. name: 'a'
  15. },
  16. arr: [{
  17. age: 1
  18. }]
  19. },
  20. watch: {
  21. // 如果 `question` 发生改变,这个函数就会运行
  22. question: function (newval, oldval) {
  23. console.log(newval, ':', oldval) // test:old
  24. this.answer = 'Waiting for you to stop typing...'
  25. },
  26. question: {
  27. handler (newval, oldval) {
  28. console.log(newval, ':', oldval) // test:old
  29. this.answer = 'Waiting for you to stop typing...'
  30. },
  31. immediate: true // 立即执行一次
  32. // deep: true // 是否深度观察
  33. // sync: true // 数据变化之后是否同步执行,默认是进行异步队列
  34. },
  35. 'info.name' (val) {
  36. // 支持路径表达式
  37. console.log(val) // b
  38. },
  39. 'arr[0].age' (val) {
  40. // 支持路径表达式
  41. console.log(val) // 100
  42. },
  43. 'question, answer' (val, old) {
  44. // 同时观察多个值, val为数组个数, question变化时
  45. console.log(val) // ['test', 'I cannot give you an answer until you ask a question!']
  46. }
  47. },
  48. attached () {
  49. // 3s之后修改数据
  50. setTimeout(() => {
  51. this.changeData()
  52. }, 3000)
  53. },
  54. methods: {
  55. changeData() {
  56. this.question = 'test'
  57. this.info.name = 'b'
  58. this.arr[0].age = 100
  59. }
  60. }
  61. })
  62. </script>

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