原生js模拟vue
{
{msg}}:{
{name}},您今年{
{age}}岁了
{
{msg}}:我是{
{name}},我确实{
{age}}岁了,我是{
{sex}}的
//new MyVue对象
let vm = new MyVue({
el:"#app",
data:{
msg:"hello", name:"张四风", age:250, sex:"男"
}
});
MyVue.js文件
//定义一个MyVue类
class MyVue{
constructor(obj){
this.el = obj.el;
this.data = obj.data;
//{msg:"hello"}
this.render();
}
//渲染(跟DOM有关)
render(){
let divDom = this.$(this.el);
//把div里的双花括号的内容替换成data 里的内容。
let htmlStr = divDom.innerHTML;
for(let key in this.data){
//msg,name // htmlStr.replace(/{
{msg}}/g,this.data.msg);
htmlStr=htmlStr.replace(new RegExp("{
{"+key+"}}","g"),this.data[key]); };
divDom.innerHTML = htmlStr; }
$(str){ if(str.charAt(0)=="#"){
return document.getElementById(str.substring(1)); }
else if(str.charAt(0)=="."){
return document.getElementsByClassName(str.substring(1)); }
else{ return document.getElementsByTagName(str); }
}
}
指令
//指令的作用:
//1、把vue对象里的data,显示(响应式)在页面上,什么是响应式?就是data一旦改变,立即会呈现在页面上。
//2、当表达式的值改变时,将其产生的连带影响,响应式地作用于 DOM
let vm = new Vue({ el:"#app",//element; 元素 data:{ //数据 isDisabled:true, attr:"href", url:"http://www.taobao.com", bar:"t" }, computed:{ attrname:function () { return 'foo' + this.bar; } } });
v-clock:解决网页网速差时的dom数据闪烁问题
v-text:纯文本
插值
v-html:解析标签
{ {msg}}:{ {htmlstr}}
年龄:{ {age+1}}
是否成年:{ {age>=18?"是的":"没有"}}
let vm = new Vue({ el:"#app", data:{ msg:"hello", htmlstr:"", isDisabled:true, age:16 } });
声明式渲染
v-bind:内联样式的属性前加,简写:
-------------
绑定属性,数据单向从m->v,可以写合法的js+“123”
{ {msg}}:{ {name}},您今年{ {age}}岁了
let vm = new Vue({ el:"#app",//element; 元素 data:{ //数据 msg:"hello", name:"张四风", age:250, imgfile:"img/1.jpg" } });
事件绑定
v-on:事件,简写方式@
let vm = new Vue({ el:"#app",//element; 元素 //methods里写函数。
methods:{ parent:function () { alert("父亲被点击了"); }, sub:function () { alert("儿子被点击了"); }, send:function () { alert("发了"); } } });
v-on:click.stop 阻止冒泡
v-on:click.prevent 阻止默认行为(a链接,submit事件)
v-on:click.capture 事件侦听时,事件捕获模式(从外到内)
v-on:click.self 只对该元素有效
v-on:click.once 只触发一次
带修饰符放入可以串联:.prevent.once(都只执行一次,先后顺序无关)
v-if:true显示元素,false元素消失【移除】
重新删除或创建,较高的切换性能消耗
v-else:if为true则他消失,if为false则他显示
v-show:true显示元素,false元素只是隐藏,并不消失【隐藏】
display:block/none,较高的初始渲染消耗
let vm = new Vue({ el:"#app",//element; 元素 data:{ //数据 isShow:false, isShow2:true } });
v-model指令,它能轻松实现表单输入和应用状态之间的双向绑定。
v-model的修饰符
.lazy: 取代input监听change事件
.number:输入字符串转为有效的数字
.trim:输入首尾空格过滤
v-pre跳过这个元素和它的子元素的编译过程。可以用来显示原始 Mustache 标签。跳过大量没有指令的节点会加快编译。
不会进行编译,页面显示会“{{}}”
请输入您的年龄:
您今年{ { age }}岁了
请输入您的体重:
您的体重{ {weight}}公斤
请输入您的名字:
您的名字:{ {name}}
您的名字:{ {name}}
let vm = new Vue({ el:"#app",//element; 元素 data:{ age:250, weight:70, name:"john" } });
v-on和v-model的简易计算器
<
input type="" name="" id="" v-model="n2" />
let vm=new Vue({
el:".app",
data:{n1:0,n2:0,opt:'+',result:0},
methods:{ cal(){ let str='parseInt(this.n1)'+this.opt+'parseInt(this.n2)'; this.result=eval(str); } }
})
v-for:循环
1、循环普通数组 v-for="type in types"
2、循环对象数组 v-for="(goods,index) in goodslist"
goods每一项,index索引值
3、循环对象 v-for="(value,key,index) in person"
值,键,index索引值
4、迭代数字 v-for="count in 4"
2.2.0+的版本,组件使用v-for,key是必须的
//循环普通数组 v-for="type in types"
//循环对象数组 v-for="(goods,index) in goodslist"
//goods每一项,index索引值
第{ {index+1}}个商品:
商品编号:{ {goods.id}}
商品名称:{ {goods.name}}
商品价格:{ {goods.price}}
//循环对象 v-for="(value,key,index) in person"
//值,键,index索引值
{ {index+1}}、{ {key}}:{ {value}}
let vm = new Vue({
el: "#app",
data: { type: "类型类别", types: ["生活用品", "文具", "家电"], title: "文具", goodslist: [{"id": "001","name": "铅笔","price": 1.5}, {"id": "002","name": "钢笔","price": 25}, {"id": "003","name": "毛笔","price": 55}], person: { "身份证号码": "007", "姓名": "刘德华", "性别": "男"} } });
v-for的key
let vm = new Vue({
el:"#app",
data:{ arr:[5,4,3,2,1]},
methods:{ sort:function () {
// this.arr.sort();
// this.arr = this.arr.filter(function (val) {
// return val>3; //
});
// this.arr[0] = 20;
//这不是响应式的,这种写法的结果不会呈现在页面上。 Vue.set(this.arr,0,20); // this.arr.splice(0,1,20); } } });
v-for:动态添加
{ {index+1}}、{ {key}}:{ {value}}
let vm = new Vue({ el:"#app", data:{ person:{ "身份证号码":"007", "姓名":"刘德华", "性别":"男" } }, //methods里写函数。 methods:{ addAttr:function () { Vue.set(this.person,"年龄",25); } } });
用key去管理可复用的元素
let vm = new Vue({ el:"#app",//element; 元素 data:{ loginType:"username" }, methods:{ changeType:function () { // this.loginType = "email"; this.loginType = this.loginType=="username"?"email":"username"; } } });
v-for(显示数组经过加工的结果)
let vm = new Vue({ el:"#app", data:{ numbers:[1,2,5,8,10], newnum:0 }, computed:{ gtTwo:function () { return this.numbers.filter(function(item){ return item>2; }); } }, methods:{ addNum:function(){ this.numbers.push(this.newnum); } } });
v-for循环里,in后面是数字
let vm = new Vue({ el:"#app", data:{ newnum:5 } });