MVVM升级实现功能

show -控制显示隐藏

model- 数据双向绑定

-动态绑定

class -动态替换class

html -动态添加html片段

text- 动态渲染text内容

on- 声明事件

computed -计算属性

$watch-内容副作用监听

js模板引擎

引入文件

<script src="@/public/vendor/mvvm/compile.js"></script>
  <script src="@/public/vendor/mvvm/mvvm.js"></script>
  <script src="@/public/vendor/mvvm/observer.js"></script>
  <script src="@/public/vendor/mvvm/watcher.js"></script>

v-show

<div id="show-features">
	<p v-show="isShow">是否是男的</p>
	<button v-on:click="clickTrigger">点击隐藏/显示</button>
</div>
let show_vm = new MVVM({
 el: '#show-features',
 	data : {///data内容声明
 		isShow : false
		 },
     methods : {///methods声明方法
			clickTrigger : (e) => {
             this.isShow = !this.isShow;///更新后会自动更改html进行处理
         }
     }
});

v-model(目前实现input输入,其他后期添加)

<div id="model-features">
 <input type="text" v-model="name" />
 <p></p>
</div>
let model_vm = new MVVM({
 el : "#model-features",
 data : {
     name : '',//可自定义默认值
 }
});
///可实现input输入与value值绑定和内容同步,叫做双向绑定

####

<div id="parantheses-features">
      <h2></h2>
      <h2></h2>
      <h2></h2>
      <h2></h2>
 <button v-on:click="clickTrigger"> 点击更新json数据 </button>
</div>
let parantheses_vm = new MVVM({
el : "#parantheses-features",
data : {
 json : {
     name : '丁平',
     tel : 'xxxxx',
     sex : '',
     address : '昆明'
 }
},
methods : {
   ///更新json对象数据,界面同步更新
   clickTrigger : () => {
       let _json = this.json;
       _json.name = "丁不平";
       _json.address = "曲靖";
        this.json = Object.assign({},this.json,_json);///对象合并才能触发数据劫持更新html
   }
}
});

text

与功能类似

<div>
<p v-text="textVariable"></p>
</div>

class

<div id="class-features">
<div v-class="classVariable">用户名称显示</div>
<button v-on:click="clickTrigger">点击切换class属性</button>
</div>
.name-color{
color: red;
font-size: 20px;

}
.name{
	font-weight: 600;
}
.name-color-small{
color: black;
font-size: 11px;
}
let class_vm = new MVVM({
el : "#class-features",
data : {
classVariable : 'name-color',

},
methods : {
  clickTrigger : (e) => {
      this.classVariable = "name-color-small";
  }
}
});

html

<div id="html-features">
 <h4>
     v-html可进行html装卸,可赋值htmlDOM也可赋值html字符串
     可以配合js模板渲染操作,详情请看 js模板选人模块
 </h4>
 <div v-html="htmlDom"></div>
</div>
let html_vm = new MVVM({
el : "#html-features",
data : {
	htmlDom : '<span>初始化暂无数据</span>',
},
});
///初始化请求装载数据
_().then( res => {
 let _res = res;
 _res = "<span>数据加载成功</span>";
 ///赋值之后自动更新html页面
 html_vm.htmlDom = _res;
});

on

格式 : v-on:事件

支持 :

clickdblclickmouseout(鼠标移动触发系列)等等等等,

详情请看JavaScript事件参考

<div id="on-features">
 <button v-on:click='clickTrigger'>点击事件声明</button>
 <button v-on:dblclick="dblclickTrigger">双击事件声明</button>
 <button v-on:mouseout="mouseoutTrigger">鼠标移出元素事件声明</button>
</div>
let on_vm = new MVVM({
 el : "#on-features",
 methods : {
      clickTrigger : () => {console.log('鼠标单击打印日志');},
      dblclickTrigger : () => {console.log('鼠标双击打印日志');},
      mouseoutTrigger : () => {console.log('鼠标移开打印日志');},
 }
});

computed

计算属性

使用场景 :当页面中有某些数据依赖其他数据进行变动的时候,就可使用

<div id="computed-features">
 <input v-model="text" />
 <input v-model="num" />
 <h4>输入值相乘</h4>
 <p></p>
</div>
let computed_vm = MVVM({
 el : "#computed-features",
 data : {
     text : 0,
     num : 0
 },
 computed : {
     sum : () => {
         return this.text * this.num;
     }
 }
});

$watch

副作用监听

使用场景 : 一般用于异步或者开销较大的操作

let vm_app = new MVVM({
el : "xxx",
data : {
  json : {
      name : "用户",
      sex : ""
  }
},
});
///实现监听数据
vm_app.$watch('json', (newVale,oldVale) => {
      console.log(`watch new word :${newVale}`);
      console.log(`watch old word :${oldVale}`);
});

js模板渲染

使用场景

复杂渲染,列表,异步操作

配合v-html使用

<head>
  <script id="interpolationtmpl" type="text/x-dot-template">
         <div>Hi !</div>
         <div></div>
 </script>
</head>

<body>
 <div id="js-features">
     <div v-html="htmlDom"></div>
 </div>
</body>
import doT from "../../../public/vendor/template/doT.js";
let js_vm = new MVVM({
 el : "#js-features",
 data : {
     htmlDom : '初始化加载'
 }
});

///初始化数据请求
_.then(res => {
    let dataInter = {"name":"Jake","age":31};
 ///获取模板
   let interText = doT.template($("#interpolationtmpl").text());
    js_vm.htmlDom = interText(dataInter);///给实例装载数据自动渲染给v-html
});

使用命令文档官方文档

详细例子博客园文档

使用规范

1、MVVM实例外部只能进行data数据更新,不能调用实例内部函数

2、v-class只能使用一个变量,多个class名请定义在实例data之中,赋值时进行字符串拼接

let on_vm = new MVVM({
    el : "#on-features",
    data : {
        className : 'name'
    }
    methods : {
         clickTrigger : () => {
    		this.className = 'name color';
         },
        
    }
});

3、js模板引擎(dot)必须配合v-html使用,自行dom操作属于重复操作,MVVM实例化中以及将dom处理好,只需调用

4、MVVM模式观念可自行看vue.js

5、一个html页面可实例化多个MVVM,MVVM之间只能进行数据读取与复制,尽量一个html最多只实例化一个MVVM

6、数据初始化或者插件初始化不能在MVVM中使用,MVVM只提供用户操作事件实例化,数据初始化请求可在外层操作给实例化复制

7、目前事件声明还不能传参,但是能接受到默认参数event

8、公共处理数据函数需要定义在实例之外,实例内部可调用外部函数

9、外部公共函数需要给实例化data复制可进行如下操作

let on_vm = new MVVM({
    el : "#on-features",
    data : {
        name : '名字'
    }
    methods : {
         clickTrigger : () => {
             publicClick(this);
         },
        
    }
});

const publicClick = (vm) => {
    vm.name = "名字更新了";
}

源码及其Demo

html-mvvm-web