vue中如何实现数据的双向绑定

时间:2022-09-26 07:38:41

vue中如何实现数据的双向绑定

实现视图变化数据跟着变:分两步,上面get中的为第二步(即再次读取的时候会调用get方法得到之前设置的值,以此来实现动态改变)
由于直接写obj.name = this.value;会导致循环调用set方法,所以要借助中间对象的形式把值赋给中间对象,获取obj.name的时候我们获取中间对象的最新值即可
let  obj = {name:'zhufeng',age:9};//数据
let temp = {name:"lily"};//借助中间对象
let input1 = document.getElementById("box2");//视图
//对某一个对象使用了Object.defineProperty方法之后就要写对应的get和set方法了,不然无法像操作普通对象一样访问或者设置它的属性
//此方法不兼容IE8及以下
Object.defineProperty(obj,"name",{
configurable:true,//属性是否可删除
writable:false,//属性是否可修改
enumerable:false,//属性是否可枚举
get(){//获取obj的属性名对应的属性值时会调用该方法
/**/ return temp['name'];
},
set(val){//设置obj的属性名对应的属性值时会调用此方法 //实现视图变化数据跟着变:分两步,上面get中的为第二步(即再次读取的时候会调用get方法得到之前设置的值,以此来实现动态改变)
//由于直接写obj.name = this.value;会导致循环调用set方法,所以要借助中间对象的形式把值赋给中间对象,获取obj.name的时候我们获取中间对象的最新值即可
/*1、*/ temp.name=val; //实现数据变化视图改变
input1.value=val;
}
});
//为了初始化的时候让视图中(文本框中)有值:出现obj.name说明要访问这个属性就会用到defineProperty中的get方法
input1.value=obj.name;
//实现视图改变数据跟着改变
input1.addEventListener("input",function(){
obj.name = this.value;//当值变化时会调用set方法
},false);

vue中的指令

dom元素的行间属性,vue提供了内置的指令,必须以v-开头,后面的值均为变量

v-cloak:

消除页面刚加载时会看到{{}}闪一下的效果,可加给最外层的根元素;

 //需要添加对应的css样式
[v-cloak]{
display: none;
}

v-model(表单元素设置了之后会忽略掉value,checked,selected)

让表单元素和数据实现双向绑定(映射关系)

 <input type="text" v-model="msg">

v-text:代替 {{}} 渲染成文本(不会识别html标签)可以防止网速卡慢时{{}}出现在页面上

{{}} 中的值都会解析成文本内容;

{{msg}}等价于<div v-text="msg"><!--此处不能再写内容,防止出现闪的效果--></div>

v-html:把html字符渲染成html

 <div v-html="msg"></div>

v-once:只绑定一次(不能写成v-once=”msg”)

    <div v-once>{{msg}}</div>

v-bind:动态地绑定一个或多个特性

// 绑定一个属性
<img v-bind:src="data:imageSrc">
//可缩写为如下形式,此时:src后面的值就可以是变量、表达式、赋值运算、计算、三元运算符(尽量少写逻辑运算)
<img :src="data:imageSrc">//此时imageSrc就代表一个变量

v-for:遍历数组、对象、字符串、数字

解决了循环问题,更高效,会在原有的基础上进行修改,会复用原有的结构,不会修改所有DOM

要循环创建哪一个标签就在那一个标签上加v-for,后面的循环最好用in,用of有时会报错循环数组或对象使用v-for指令
<div v-for="(val,index) in msg">
{{val,index}}//msg为数组时,val为数组中的每一项,index为索引
</div>
<div v-for="(value,key,index) in msg">
{{key}}={{value}}{{index}};//msg为对象时,key为对象中的每个属性名,value为属性值,index为索引
</div>

条件渲染:v-if v-else-if v-else与v-show

v-if v-else-if v-else:条件满足才渲染v-if所在标签以及标签内的内容;(操作的是DOM结构)

  • 设置条件判断的DOM元素必须是连续的
  • 操作的是DOM元素
  • key 管理复用的元素 若不想复用DOM元素,只需要给相应的DOM元素增加不同的key值
  • 支持 template 标签
  • 频繁的显示和隐藏用v-if会很浪费性能(操作的是DOM结构),此时要用v-show(操作的是CSS样式)
<div id="app">
<button @click="flag=!flag">请点击</button>
//template标签是vue提供给我们的没有任何实际意义,用来包裹元素用的(v-show不支持template标签)
<template v-if="flag">
<label>登录</label>
<input type="text" key="1">//key 管理复用的元素 若不想复用DOM元素,只需要给相应的DOM元素增加不同的key值
</template>
<template v-else>
<label>注册</label>
<input type="text" key="2">
</template>
</div>
let vm=new Vue({
el:'#app',
data:{
flag:true
}
});

v-show

条件满足才让v-show所在标签以及标签内的内容显示(操作的是元素的css样式),不支持 template 标签

 <input type="text" v-show="flag">//flag为true时,input框才显示

v-on:监听 DOM 事件(v-on:click可缩写为@click)

可以用 v-on 指令监听 DOM 事件,并在触发时运行一些 JavaScript 代码(在 methods 对象中定义的方法,而且methods中的方法名不能和data中的变量名一样)

 <div v-on:click ="fn1('zhaosi,$event')">{{msg}}</div>
<div @click ="fn1('zhaosi,$event')">{{msg}}</div>//上面的简写
方法后面可加()可不加。不加的话默认会传入事件对象e,
加()代表要传参数,如果要用事件对象,则需要传$event

自定义指令

可通过在vue实例的directives:{}属性中赋予自定义指令意义

<div id="app">
<button v-color="flag">变色</button>
</div>
let vm=new Vue({
el:'#app',
data:{
flag:true
},
directives:{//在这里赋予对应自定义指令意义
//可直接写对应的指令不用写v-
color(el,val){
//el和val都是默认给的:el指的是指令所绑定的DOM元素,val是一个对象,里面存储的是有关指令的信息,可用val.value获取到指令绑定的变量(或者表达式)所代表的值,这里就是flag所代表的值 'red'
el.style.background=val.value;
}
}
});

vue中的修饰符

表单修饰符

  • v-model.number:将用户的输入值转为数值类型
  • v-model.lazy:在表单触发change事件时更新数据,而非触发input事件时更新数据
  • v-model.trim:自动过滤用户输入的首尾空白字符

事件修饰符

  • @click.stop:阻止点击事件的传播(往上传播和往下传播都会被阻止)
  • @submit.prevent:阻止点击提交按钮时的默认行为(阻止事件的默认行为)
  • @click.capture:点击的时候让事件在捕获阶段执行;
  • @click.once:只在第一次点击的时候让绑定的事件执行;
  • @click.self:只有点击的事件源是自己的时候触发事件;(判断事件源)

表单元素双向数据绑定(双向同步)

使用v-model属性可让input中的内容和数据实现双向同步,但是使用了v-model属性之后,input的value、checked、select属性都会失效

<div id="app">
<input type="text" v-model="msg">
</div>
<script src="vue.js"></script>
<script>
let vm=new Vue({
el:'#app',//vue的属性和方法对哪个DOM根元素起作用(对它的后代元素也起作用)
//数据
如果data中属性的值是一个数组,如果想改变数组中内容,只能使用原生的会修改原数组的方法进行修改,普通的 数组[索引]=值 不行;
data:{//写在data中的属性都会挂载到当前实例上
msg:'zhufeng'
}
});
console.log(vm.msg);//'zhufeng'
</script>

单选框

对于单选框和复选框来说,加了v-mdel属性后,初始设置的value属性不会失效;

 <div id="app">
<input type="radio" v-model="msg" value="男">男
<input type="radio" v-model="msg" value="女">女
{{msg}}
</div>
let app3=new Vue({
el:'#app',
data:{
msg:'男'//默认选中的项,值与value的值对应,点击女的时候msg就会动态改为女
}
});

复选框

单个复选框:

 <div id="app">
//复选框中加了v-model后value依然可用
<input type="checkbox" v-model="msg">
</div>
let app3=new Vue({
el:'#app',
data:{
//如果是复选框且只有一个的时候,会把msg的值转化为布尔值,如果为true,代表选中
msg:false//为false时代表默认不选中
}
});

多个复选框,需要绑定到同一个数组,而且要给input设置初始value值,为了在后面选中的时候获取到对应的选中框的值

 <div id="app">
//复选框中加了v-model后value依然可用
<input type="checkbox" v-model="msg" value="吃饭">吃饭
<input type="checkbox" v-model="msg" value="睡觉">睡觉
<input type="checkbox" v-model="msg" value="敲代码">敲代码
{{msg}}
</div>
new Vue({
el: '#app',
data: {
msg: [] //此处的msg需要是一个数组
}
})

下拉框

   <div id="app">
//加了multiple后就变为多选框,用ctrl+左键点击多选,msg也要换为一个数组
<select v-model="msg" multiple>
//加了disabled时候用户就不能选中此项了
//option中的value是给写代码的人看的
<option value="0" disabled>请选择地区</option>
<option value="1">北京</option>
<option value="2">上海</option>
<option value="3">浙江</option>
</select>
{{msg}}//如果option的value属性不写,则取的是option中的内容
</div>
let app3=new Vue({
el:'#app',
data:{
msg:'0'//默认选中的某一项,值与每一个option的value值对应
}
});

Vue中的Class样式与style样式动态绑定(动态的优先级高于原来的)

:class=”{}”或者:class=”[]: 
通过:class=”{}”或者:class=”[]来动态的绑定class样式,与原来的class样式不冲突。 
有两种方式: 
1、对象的方式绑定 
2、数组的方式绑定

 <div id="app">
<!--以对象的方式动态绑定class样式:当flag为true时,z样式生效。y样式不生效-->
<div class="x" :class="{z:flag,y:false}">我的世界</div>
<!--以数组的方式动态绑定class样式:y,z两个样式都会生效-->
<div class="x" :class="[y,z]">我的世界</div>
</div>
let vm=new Vue({
el:'#app',
data:{
flag:true
}
});

:style=”{}”或者:style=”[]”:绑定行内的样式 
通过上述的方式来动态绑定行内的样式

<div id="app">
//第一种是对象的方式
<div :style="{backgroundColor:'red',color:'pink'}">我是谁</div>
//第二种是数组的方式
<div :style="[str1,str2]">我的世界</div>
</div>
let vm=new Vue({
el:'#app',
data:{
str1:{backgroundColor:'blue'},
str2:{color:'yellow'}
}
});

根据hash实现单页面开发

通过hash记录跳转的路径(可以产生历史管理) 
浏览器自带的历史管理方法history(history.pushState(),push到哪里就跳转到哪里),可能会导致404错误(因为用户可能会随意输入路径) 
开发时使用hash的方式,上线的时候使用history的方式 
[使用hash存储]

//存储:存储的时候要把存储的对象转换成字符串
localStorage.setItem('todo',JSON.stringify(obj));
//获取:获取的时候要把字符串转换成对象
JSON.parse(localStorage.getItem('todo'));

vue中如何实现数据的双向绑定的更多相关文章

  1. Vue源码解析---数据的双向绑定

    本文主要抽离Vue源码中数据双向绑定的核心代码,解析Vue是如何实现数据的双向绑定 核心思想是ES5的Object.defineProperty()和发布-订阅模式 整体结构 改造Vue实例中的dat ...

  2. vue - 数据驱动,组件化, 双向绑定原理

    1.数据驱动 传统的前端数据交互是用Ajax从服务端获取数据,然后操作DOM来改变视图: Vue.js 是一个提供了 MVVM 风格的双向数据绑定的 Javascript 库,专注于View 层.它让 ...

  3. vue2&period;X props 数据传递 实现组件内数据与组件外的数据的双向绑定

    vue2.0 禁止 子组件修改父组件数据 在Vue2中组件的props的数据流动改为了只能单向流动,即只能由组件外(调用组件方)通过组件的DOM属性attribute传递props给组件内,组件内只能 ...

  4. JavaScript实现数据的双向绑定

    接触到Angulr.js和Vue.js后,提到最多的就是双向绑定 下面将用JavaScript实现数据的双向绑定 <!DOCTYPE html> <html> <head ...

  5. 通过原生js实现数据的双向绑定

    通过js实现数据的双向绑定 : Object.defineProperty了解 语法: Object.defineProperty(obj, prop, descriptor) obj 要定义属性的对 ...

  6. 数据的双向绑定 Angular JS

    接触AngularJS许了,时常问自己一些问题,如果是我实现它,会在哪些方面选择跟它相同的道路,哪些方面不同.为此,记录了一些思考,给自己回顾,也供他人参考. 初步大致有以下几个方面: 数据双向绑定 ...

  7. React入门---事件与数据的双向绑定-9

    上一节中,我们是从父组件给子组件传送数据,要实现事件与数据的双向绑定,我们来看如何从子组件向父组件传送数据; 接触之前,我们看一些里面函数绑定的知识: 例:通过点击事件改变state的age属性值: ...

  8. 数据的双向绑定 Angular JS之开端篇

    接触AngularJS许了,时常问自己一些问题,如果是我实现它,会在哪些方面选择跟它相同的道路,哪些方面不同.为此,记录了一些思考,给自己回顾,也供他人参考. 初步大致有以下几个方面: 数据双向绑定 ...

  9. 在Vue中由后台数据循环生成多选框CheckBox时的注意事项

    多选框是一种非常常见的功能,有时候我们会根据后台返回的数据进行多选框渲染,之前做项目时遇到循环生成多选框时,v-model绑定的值会随着选中与取消改变,但页面却不会变化 的情况,后来测试了一下,发现多 ...

随机推荐

  1. ionic实现手机检测app是否安装,未安装则下载安装包,已安装则打开app(未实现iOS平台)

    插件需求(上cordova官网下载): com.lampa.startapp cordova-plugin-appavailability cordova-plugin-inappbrowser 代码 ...

  2. yum 介绍

    yum是一个用于管理rpm包的后台程序,用python写成,可以非常方便的解决rpm的依赖关系.在建立好yum服务器后,yum客户端可以通过 http.ftp方式获得软件包,并使用方便的命令直接管理. ...

  3. Nagios学习笔记一:基本安装和配置

    ()解决安装Nagios的依赖关系: Nagios基本组件的运行依赖于httpd.gcc和gd.可以通过以下命令来检查nagios所依赖的rpm包是否已经完全安装: # yum -y install ...

  4. 正整数N是否是素数

    来自:[数据结构与算法分析——C语言描述]练习2.13 问题描述: a. 编写一个程序来确定正整数N是否是素数. b. 你的程序在最坏的情形下的运行时间是多少(用N表示)? c. 令B等于N的二进制表 ...

  5. 深入Android媒体存储服务(一):APP与媒体存储服务的交互

    简介: 本文介绍如何在 Android 中,开发者的 APP 如何使用媒体存储服务(包含MediaScanner.MediaProvider以及媒体信息解析等部分),包括如何把 APP 新增或修改的文 ...

  6. uva 620 Cellular Structure

    题目连接:620 - Cellular Structure 题目大意:给出一个细胞群, 判断该细胞的可能是由哪一种生长方式的到的, 输出该生长方式的最后一种生长种类, "SIMPLE&quo ...

  7. Mahout-Pearson correlation的实现

    计算公式: 并通过以下代码对Mahout in Action的结果进行了验证: 代码例如以下: ` package com.example.mahout; public class TestColl ...

  8. ASP&period;NET MVC5 插件机制中插件的简单实现

    Autofac 依赖注入 ASP.NET MVC5 插件机制中插件的简单实现 一.前言 由于项目业务复杂,创建了多个插件并把他们放在了不同的项目中,项目使用AutoFac做的IOC:但是主项目可以注入 ...

  9. 个人项目中的WCF使用

    今天闲着无事,给大家分享一下我的一个项目中WCF的使用.我这项目使用的是Silverlight,至于其他类型的使用方法也是一样的. 1.建立一个Silverlight带Web项目的解决方案. 2.在w ...

  10. 远景面试算法题——FolderSize

    描述 文件被存储在磁盘上的时候,通常为cluster方式.每个cluster具有固定的大小,一个文件所消耗的空间量始终是cluster大小的整数倍.因此,如果cluster的大小为100字节,165字 ...