template扩展特性

对于模板部分,我们提供了class与style的绑定,wx:model指令,动态组件等特性

class与style绑定

类似vue的class绑定

例子:

  1. <template>
  2. <view wx:class="{{ {active: isActive} }}">
  3. 这是一段测试文字
  4. </view>
  5. </template>
  6. <script>
  7. import {createComponent} from '@mpxjs/core'
  8. createComponent({
  9. properties: {
  10. isActive: Boolean
  11. }
  12. })
  13. </script>
  14. <style lang="stylus">
  15. .active
  16. background-color blue
  17. </style>

当该组件接受一个参数isActive为true时,就会为view加上class:active。

注意:由于编译能力的限制,在wx:for中使用class和style绑定不能将for中的item和index作为数据传入,如果有对应需求可以使用包装组件将item和index作为props传入,在包装组件内部使用class和style绑定实现。

例子:
父组件

  1. <template>
  2. <view>
  3. <!--直接将for中的item/index传入wx:style和wx:class中无法正常运行-->
  4. <view wx:for="{{list}}" wx:style="{{item.style}}">{{item.name}}</view>
  5. <!--将item/index传入包装组件中,再在包装组件内使用wx:style和wx:class进行样式和类名绑定-->
  6. <wrap wx:for="{{list}}" item="{{item}}"></wrap>
  7. </view>
  8. </template>
  9. <script>
  10. import {createComponent} from '@mpxjs/core'
  11. createComponent({
  12. data:{
  13. list:[
  14. {
  15. name: 'red',
  16. style: {
  17. color: 'red'
  18. }
  19. },
  20. {
  21. name: 'blue',
  22. style: {
  23. color: 'blue'
  24. }
  25. }
  26. ]
  27. }
  28. })
  29. </script>

子组件

  1. <template>
  2. <view wx:style="{{item.style}}">{{item.name}}</view>
  3. </template>
  4. <script>
  5. import {createComponent} from '@mpxjs/core'
  6. createComponent({
  7. properties: {
  8. item: Object
  9. }
  10. })
  11. </script>

内联事件绑定

对于事件处理在模板上的绑定,原生小程序只能通过事件信息结合手工拿取data里的信息,我们希望能和vue的事件绑定一样更灵活地传参

例子:

  1. <template>
  2. <view>
  3. <view bindtap="handleTap1(1)">Click me!</view>
  4. <view bindtap="handleTap2(testVal, $event)">Click me!</view>
  5. </view>
  6. </template>
  7. <script>
  8. import {createComponent} from '@mpxjs/core'
  9. createComponent({
  10. data: {
  11. testVal: '123'
  12. },
  13. methods: {
  14. handleTap1 (val) {
  15. console.log(val) // 1
  16. },
  17. handleTap2 (val, event) {
  18. console.log(val) // '123'
  19. console.log(event) // 微信原生事件
  20. }
  21. }
  22. })
  23. </script>

动态组件

通过使用保留的 <component> 组件,并对其 is 特性进行动态绑定,你可以在同一个挂载点动态切换多个组件:

  1. <template>
  2. <!--动态组件,此处的componentName为json中注册的usingComponents的key值-->
  3. <component is="{{componentName}}"></component>
  4. </template>
  5. <script>
  6. import {createComponent} from '@mpxjs/core'
  7. createComponent({
  8. data: {
  9. componentName: 'test'
  10. },
  11. ready () {
  12. setTimeout(() => {
  13. this.componentName = 'list'
  14. }, 3000)
  15. }
  16. })
  17. </script>
  18. <script type="application/json">
  19. {
  20. "usingComponents": {
  21. "list": "../components/list",
  22. "test": "../components/test"
  23. }
  24. }
  25. </script>

双向绑定

除了小程序原生指令之外,mpx 基于input事件扩展了一个指令 wx:model, 用于双向绑定。

例子:

  1. <template>
  2. <view>
  3. <input wx:model="{{val}}"/>
  4. <input wx:model="{{test.val}}"/>
  5. <input wx:model="{{test['val']}}"/>
  6. </view>
  7. </template>
  8. <script>
  9. import {createComponent} from '@mpxjs/core'
  10. createComponent({
  11. data: {
  12. val: 'test',
  13. test: {
  14. val: 'xxx'
  15. }
  16. }
  17. })
  18. </script>

wx:model并不会影响相关的事件处理函数,比如像下面这样:

  1. <input wx:model="{{inputValue}}" bindinput="handleInput"/>

wx:model对应的属性和事件

wx:model默认监听input事件使用value属性传值,如果我们希望改变默认行为,可以使用wx:model-propwx:model-event来定义wx:model对应的属性和事件:

父组件

  1. <template>
  2. <customCheck wx:model="{{checked}}" wx:model-prop="checkedProp" wx:model-event="checkedChange"></customCheck>
  3. </template>
  4. <script>
  5. import {createPage} from '@mpxjs/core'
  6. createPage({
  7. data: {
  8. checked: true
  9. }
  10. })
  11. </script>

子组件(customCheck)

  1. <template>
  2. <view bindtap="handleTap">{{checkedProp}}</view>
  3. </template>
  4. <script>
  5. import {createComponent} from '@mpxjs/core'
  6. createComponent({
  7. properties: {
  8. checkedProp: Boolean
  9. },
  10. methods: {
  11. handleTap () {
  12. // 这里第二个参数为自定义事件的detail,需要以下面的形式传递值以保持与原生组件对齐
  13. this.triggerEvent('checkedChange', {
  14. value: !this.checkedProp
  15. })
  16. }
  17. }
  18. })
  19. </script>

如示例,当子组件被点击时,父组件的checked数据会发生变化