vue笔记(一)基本使用、数据检测

vue 官网

Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。

一、基本使用
二、数据检测


一、Vue的思想

MVC【参考 nd的博客园】:

名称描述
M(model)数据,ajax/jsonp/数据解析,可以复用;
V(view)视图表现层,展示数据、创建元素、变色、运动、可以复用;
C(control )控制层(串业务,事件驱动),一般不复用;

二、基本使用

1. 下载js
在这里插入图片描述
开发时下载开发版本,包含警告和调试模式,开发完成将 js 文件替换成生成版本。

2. Vue是一个需要被实例化的类。 new 出来一个 Vue 实例,传一堆配置参数,控制一片 html。

new Vue 返回 vm;
<script>let vm = new Vue({ //配置el: '选择器', //要控制的那片html代码data: { //数据 value可以是Number/String/Boolean/Json/Object/Array/undefined/nullkey: value}, methods: {} //方法})
</script>

3. 只有当实例被创建时就已经存在于 data 中的 变量值 才是响应式的。 如果你在根级别添加一个新的 自定义变量,对 这个变量(property) 改动将不会触发任何视图的更新。

<div id="app"><h3>{{title}}</h3>
</div>let vm = new Vue({el: '#app',data: { title: "标题",},
});
vm.bulala = "bm"; //这个是不会在视图层中响应的
console.log(vm.bulala);

注意:console.log(vm._data); vm._data指向 vm 的 data。

Vue 实例-数据与方法

4. 如何将数据绑定到 view 层:

<div id="app"><!-- 1. mustatce方法 --><h3>{{title}}</h3><!-- 2. 属性绑定或者叫做通过自定义指令绑定 --><p v-text="content"></p><!-- 3. 绑定html、绑定dom属性 --><img v-bind:src="url" alt=""/><!-- v-bind:可以直接用“:”代替 <img :src=url" alt=""/> --><!-- 4. 列表渲染 --><ul><li v-for="val in this.arr">{{val}}</li></ul><ul><li v-for="o in this.obj">{{o.name}}</li></ul><ul><li v-for="item in json">{{item.name}}<ul><li v-for="child in item.children">{{child}}</li></ul></li></ul><!-- 5. 条件渲染 --><div v-show="bl">box</div>
</div>
let vm = new Vue({el: '#app',data: { title: "标题",content: "内容",url:"https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=3782458567,4050719791&fm=26&gp=0.jpg",arr:['a','b','c','d'],obj:[{id:1, name:"alex1"},{id:2, name:"alex2"},{id:3, name:"alex3"},],json: [{id:1, name:"alex1", children:[1,2,3]},{id:2, name:"alex2", children:null},{id:3, name:"alex3", children:["a","b"]},],bl: true},
});

注意【Vue列表渲染-维护状态】:当 Vue 正在更新使用 v-for 渲染的元素列表时,它默认使用“就地更新”的策略。如果数据项的顺序被改变,Vue 将不会移动 DOM 元素来匹配数据项的顺序,而是就地更新每个元素,并且确保它们在每个索引位置正确渲染。

这个默认的模式 只适用于不依赖子组件状态或临时 DOM 状态 (例如:表单输入值) 的列表渲染输出。

为了给 Vue 一个提示,以便它能跟踪每个节点的身份,从而重用和重新排序现有元素,你需要为每项提供一个唯一 key 属性。

<div v-for="item in items" v-bind:key="item.id"><!-- 内容 -->
</div>

三、数据检测

响应式:Vue 的数据模型仅仅是普通的 JavaScript 对象。而当你修改它们时,视图会进行更新。 通俗一点,通过改变 Model 层(new Vue 中的 data)的数据,view 层会跟着发生改变。

Vue 的数据是响应式的。由于 JavaScript 的限制,Vue 不能检测数组和对象的变化。

1. 数组的数据变化
(1)利用索引直接设置一个数组项。 或对数组使用了非变异方法(现在叫做“非变更方法”)。

变更方法:顾名思义,会变更调用了这些方法的原始数组,比如:push()、pop()、shift()、unshift()、splice()。


非变更方法:总是返回一个新数组,并不会修改原数组。比如:filter()、concat()、 slice()

<div id="app"><button@click="changeData">改变数据</button><ul><li v-for="(val,id) in arr" :key="id">{{val}}</li></ul><ul><li v-for="(item,id) in json" :key="id">{{item}}</li></ul>
</div>
<script>let vm = new Vue({el: "#app",data: {arr:[1,2,3],json: [{a:"aa", b: "bb", c: "cc"},{a:"aa", b: "bb", c: "cc"},]},methods: {changeData(){this.arr[1]=333;  //非变异方式(改变数组根键/利用索引直接改值),非响应式        console.log(this.arr);}}})
</script>

在这里插入图片描述
注意: 点击时,将 this.json[1].b='bbb';,这是响应式的。修改对象数组里面已有的键值时不会出现问题

  • 解决: Vue.set(数组对象, key, value)vm(或者 this ).$set(数组对象, key, value)
//将 this.arr[1]=333; 替换成下面代码
Vue.set(this.arr, 1, 333);
//或者
this.$set(this.arr, 1, 333);
// 或者
vm.$set(this.arr, 1, 333);

(2)修改数组的长度:
在上面(1)的例子中,将 this.arr.length = 0;,会发现

<div id="app"><button@click="changeData">改变数据</button><ul><li v-for="(val,id) in arr" :key="id">{{val}}</li></ul>
</div>
<script>let vm = new Vue({el: "#app",data: {arr:[1,2,3]},methods: {changeData(){this.arr.length = 0;  //非响应式        console.log(this.arr);}}})
</script>

在这里插入图片描述

  • 解决: 使用 splicevm.数组名称.splice(newLength);
// 将 this.arr.length = 0; 用下面代码替换
vm.arr.splice(0);
//或者
this.arr.splice(0);

2. 对象的数据变化

(1)在根级别添加一个自定义变量(也可以叫做这个实例的自定义变量 或 property),这个变量是不响应的。

<div id="app"><span>{{a}}</span>{{b}}
</div>
<script>let vm = new Vue({el: "#app",data: {a:1 //a是响应的}});vm.b = "11"; //b是不响应的console.log(vm._data); //指向的是在vm 中的 data 对象,返回:{a:1}console.log(vm.b) //指向在根级下的变量 b。 返回:11
</script>
  • 解决: 把变量在 data 中初始化。
data: {obj: {a:1, b:2},b:"11"
}

property 必须在 data 对象上存在才能让 Vue 将它转换为响应式的。

(2)在已经创建的对象数据身上新增一个变量。

<div id="app"><button@click="changeData">改变数据</button><ul><li v-for="o in obj">{{o}}</li></ul>
</div>
<script>let vm = new Vue({el: "#app",data: {obj: {a:1, b:2}},methods: {changeData(){this.obj.c=3;  //非响应式        console.log(this.obj);}}});
</script>

在这里插入图片描述

  • 解决: 或者在方法中使用:Vue.set(数组对象, key, value)vm(或者 this ).$set(数组对象, key, value),当然也可以使用 Object.assign()
//将 this.obj.c=3; 用下面代码代替
Vue.set(this.obj, 'c', 3);
//或者
this.$set(this.obj, 'c', 3);
// 或者
vm.$set(this.obj, 'c', 3);

(3)增加/修改已经创建的对象身上的一个或多个变量值。

  • 解决: 原数组 = Object.assign({}, 原数组, {新增/修改的字段名:值});
<div id="app"><button@click="changeData">改变数据</button><ul><li v-for="o in obj">{{o}}</li></ul>
</div>
<script>let vm = new Vue({el: "#app",data: {obj: {id:1, name: "Lisa", age: 18, job: 'student'}},methods: {changeData(){    // 将原来 obj 中的name改为Bod,age改为20,新增一个字段sex,值为“女”this.obj= Object.assign({}, this.obj, {name:"Bob", age: 20, sex: "女"});}}});
</script>

在官网中,建议使用 this.someObject = Object.assign({}, this.someObject, { a: 1, b: 2 }),代替 使用 Object.assign(this.someObject, { a: 1, b: 2 })【这种方法是非响应式的,只是合并对象】。可以去比较一下这两个的区别:两种Object.assign响应式修改对象方式


下一篇:vue笔记(二)Vue-class与style、事件、计算属性、数据监听、自定义指令、过滤器、v-cloak

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/362308.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hazelcast入门指南第2部分

本文是我开始以Hazelcast &#xff08;分布式内存数据库&#xff09;为特色的系列文章的继续。 如果尚未阅读第一篇文章&#xff0c;请单击此处 。 分布式馆藏 Hazelcast具有许多可用于存储数据的分布式集合。 以下是它们的列表&#xff1a; 清单 我设置 队列 清单 IList是…

防止DISCUZ根域名跳转到forum.php的方法

症状&#xff1a;输入http://www.sn03.com/跳转到www.cn03.com/forum.php&#xff0c;这样有两个不好&#xff0c;1、用户复制时不利于传播&#xff0c;2、两个页面内容的重复对搜索引擎排名不利&#xff0c;如何取消这个呢&#xff1f; 全局-域名设置-应用域名-默认&#xff1…

Hazelcast入门指南第1部分

介绍 我将在Hazelcast上做一个系列。 我从Twitter了解了该产品。 他们决定跟随我&#xff0c;经过对他们所做工作的研究后&#xff0c;我决定跟随他们。 我在推特上说&#xff0c;Hazelcast将是分布式密码破解者的重要Struts。 这引起了一些兴趣&#xff0c;我决定加入一个。 H…

Vue 组件与复用

&#xff08;1&#xff09;全局注册 <!DOCTYPE html><html lang"zh"><head><meta charset"UTF-8" /><title>Vue</title></head><body><div id"app"><my-component></my-compone…

js笔记(二)数组、对象、this

大标题小节一、数组1. 数组的创建、赋值、分类&#xff1b;2. 数组的简单操作&#xff08;根据索引增、查、改&#xff09;&#xff1b;3. 声明式和构造函数创建的数组的区别&#xff1b;4.数组的方法&#xff1a;push()、unshift()、splice()、pop()、shift()、slice()、sort(…

Oracle SYSAUX 表空间 说明

一. SYSAUX 说明 在Oracle 10g 版本中&#xff0c;引入了SYSTEM表空间的一个辅助表空间&#xff1a; SYSAUX表空间。 SYSAUX 表空间存放一些其他的metadata组件&#xff0c;如OEM,Streams 等会默认存放在SYSAUX表空间里。这样也能降低SYSTEM表空间的负载。 因此SYSAUX 表空间也…

JAXB –新手的观点,第2部分

在本系列的第1部分中&#xff0c;我讨论了使用JAXB和JPA将数据从XML文件加载到数据库中的基础知识。 &#xff08;如果需要使用JSON而不是XML&#xff0c;则相同的想法应转化为类似Jackson的工具。&#xff09;该方法是使用共享域对象-即&#xff0c;一组带有描述XML映射和关系…

[C++Primer] 第二章 变量和基本类型

第二章 变量和基本类型 引用 引用定义的时候必须初始化。引用初始化之后无法重新绑定到其它对象上。引用本身并不是对象&#xff0c;所以没有指向引用的引用&#xff08;不管如何多层引用&#xff0c;引用的还是源对象&#xff09;下面用一个简单的例子说明&#xff1a; int a1…

VUE v-bind绑定class和style

1、绑定class &#xff08;1&#xff09;对象语法 <!DOCTYPE html><html lang"zh"><head><meta charset"UTF-8" /><title>vue示例</title></head><body><div id"app"><div class&quo…

js笔记(四)内置对象Math和Date()、浏览器对象模型BOM

大标题小标题备注一、内置对象Math、Date()1. Math 数学对象;2. Date() 日期对象;常用的数学对象&#xff1a;Math.PI、abs(n)、round(n)、random()、floor(n)、ceil(n)、pow(x,y)、sqrt(n)、min(3,4,5,6)、max()、sin(弧度)、cos()、tan()&#xff1b;获取日期&#xff1a;get…

ListView展示SIM信息

首先看一下程序运行后的图片&#xff1a; 在开始写代码之前&#xff0c;看展示下程序的结构&#xff1a; 下面开始代码, 第一步&#xff0c;主程序代码&#xff1a; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.os.Bundl…

MQ

https://mp.weixin.qq.com/s/AFjYLtqGXkOVHcETePBHBw https://mp.weixin.qq.com/s/5pPjUOfAH6IN7cXMgMvoKw转载于:https://www.cnblogs.com/codeLei/p/11052781.html

代理的JavaOne 2014观察

我今年无法参加JavaOne&#xff0c;但很高兴看到一些在线资源涵盖了JavaOne 2014的活动。在本文中&#xff0c;我总结了JavaOne 2014的一些观察结果&#xff0c;并提供了指向提供这些观察结果的参考的链接。提供有关这些观察的更多背景细节。 列出的观察结果没有特定的顺序&…

push和unshift方法

push和unushift都是向数组插入元素。 push是向数组尾部插入元素。 unshift是向数组头部插入元素。 共同点&#xff1a;都可以一次插入多个元素。 arrayObject.push(newelement1,newelement2,....,newelementX) arrayObject.unshift(newelement1,newelement2,....,newelement…

js笔记(五)文档对象模型DOM

大标题小节一、DOM选择器1. id 选择器&#xff1a;getElementById("id名")&#xff1b;2. class 选择器&#xff1a;getElementByClassName("class名")&#xff1b;3. 标签选择器&#xff1a;getElementsByTagName("标签名")&#xff1b;4. name…

星期五基准功能Java

让我们的产品负责人想象一下有一天会发疯&#xff0c;并要求您执行以下操作&#xff1a; From a set of Strings as follows : “ marco_8”&#xff0c;“ john_33”&#xff0c;“ marco_1”&#xff0c;“ john_33”&#xff0c;“ thomas_5”&#xff0c;“ john_33”&am…

SEO优化实践操作

合理的title、description、keywords&#xff1a;搜索对着三项的权重逐个减小&#xff0c;title值强调重点即可&#xff0c;重要关键词出现不要超过2次&#xff0c;而且要靠前&#xff0c;不同页面title要有所不同&#xff1b;description把页面内容高度概括&#xff0c;长度合…

Flot画实时曲线

源代码&#xff1a; <head> <meta http-equiv"Content-Type" content"text/html; charsetutf-8" /> <title>深海的小鱼编制-PLOT</title> <script language"javascript" type"text/javascript" src"…

RHQ指标的WildFly子系统

对于RHQ-Metrics&#xff0c;我已经开始为WildFly 8编写一个子系统&#xff0c;该子系统能够在WildFly内收集指标&#xff0c;然后以固定的时间间隔&#xff08;当前为每分钟&#xff09;将其发送到RHQ-Metrics服务器。 下一张图是该发件人连续运行1.5天时结果的可视化效果的G…

Linux下实现客户端和服务器端的通信

首先&#xff0c;可以将代码复制下来放到U盘里&#xff0c;然后挂载到Linux上 挂载步骤 找到设备->USB->你U盘的名字 挂载成功 访问U盘把代码拷贝到home文件夹下&#xff0c;就可以直接进行编译。 client.c #include <stdio.h> #include <unistd.h>#include…