4. 宏指令 -- Highway MVVM

文本元素中属性值替换

<span>hi, i am {{name}}, {{old}} ages old</span>

// 无效。宏指令不能有相邻兄弟节点。
<span>hi, i am {{name}}, {{old}} ages old <strong></strong></span>

宏指令不能有相邻兄弟节点,否则无法生效

4-1. 内建

4-1-1. 绑定

绑定部分参考第二章节2. 绑定,同。

双向绑定-安全{{ prop }}hi, i am {{name}}
双向绑定-非安全{{{ prop }}}hi, i am {{{name}}}
单向绑定-安全[[ prop ]]hi, i am [[name]]
单向绑定-非安全[[[ prop ]]]hi, i am [[[name]]]

4-2. 自定义

自定义宏指令为一个工厂函数

4-2-1. 入参

  • el:<span>hi,user.name</span> el值为$(span)。
  • exp:hi,user.name exp值为’{{user.name}}’
  • $update: 更新函数。hi, i am {{name}}, {{old}} ages old中有两个宏指令实例,任意一个值发生变化都需要触发更新。
  • $scope: 当前作用域。
  • $ctx: 当前上下文。
// 定义一个宏指令工厂函数,将数值前添加$符,格式为$100$
const money = function ({$exp, $update, $scope, $ctx}) {
  const money = $exp.replace
};

4-2-2. 出参

  • $mount: 生命周期函数,挂载时调用
  • $unmount: 生命周期函数,销毁时调用
  • iterator: text参数,为当前的文本内容;常量时需要返回$value值。

4-2-3. 全局

使用Highway.marco定义,需指定正则表达式和宏指令工厂函数

4-2-4. 局部

指定视图中有效,通过$marcos指定,需指定正则表达式和宏指令工厂函数

4-2-5. 实例

自定义宏指令,将数值转化为百分比格式,指令格式为 prop [prop] , 其中指定 prop 为双向绑定, [prop] 单向绑定。

examples/macros/customized.html

<div id="app">
  <p>two way bind is: ${ratio}$</p>
  <p>one way bind is: $[ratio]$</p>
  <button hi-on:click="change">Change</button>
</div>

// 自定义指令
const percentage = function ({$exp, $update, $scope, $ctx}) {
    const prop = $exp.replace(/[\\${}\[\] ]/g, '');
    const handler = function () {
      return ($scope.$get(prop) - 0) * 100 + '%';
    };

    // 双向绑定
    if (/\$\{[^\\}]+\}\$/.test($exp)) {
      return {
        $mount() {
          $scope.$watch(prop, $update);
        },
        $unmount() {
          $scope.$unwatch(prop, $update);
          pipeline.destroy();
        },
        $iterator($text) {
          return $text.replace($exp, function () {
            return handler();
          });
        }
      }
    } else {
      return {
        $iterator: {
          $value: handler()
        }
      }
    }
  };

  // 全局
  //Highway.macro('\\$\\{[^$]+\\}\\$|\\$\\[[^$]+\\]\\$', percentage)

  const app = new Highway({
    $el: $('#app'),
    $scope: {
      ratio: 0.95
    },
    // 局部
    $macros: {
      '\\$\\{[^$]+\\}\\$|\\$\\[[^$]+\\]\\$': percentage
    },
    change() {
      this.$scope.$set('ratio', '0.90')
    }
  });
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值