小型项目 就可以使用 vue 就高度了
随着页面的复杂程序提高,就要学习 vue-rouer 来管理更多的页面
再随着项目的数据越来越多,管理数据也变得麻烦起来了,就开始使用 vuex 来管理数据
3.2 框架 : 一整套的解决方案
比如 : 想要添加样式, 就调用 jquery 中的 .css() / .addClass()
比如 : 想给 A:设置样式 A.css(), B:addClass() C:style.background='red'
比如 : 想用vue,组件里遍历就得使用 v-for, 下次不用 v-for 了,使用 for 不行 v-for=‘item in list’
也就是 : 谁起到了主导作用
Vue 使用的是 MVVM 模式
为什么要学习 MVVM ?
频繁的操作DOM
数据双向绑定
让数据自动的双向同步
每个人操作 DOM 的方法不一样,会造成性能不一样
官网 : 虽然没有完全遵循 MVVM 模型,但是 Vue 的设计也受到了它的启发。因此在文档中经常会使用 vm (ViewModel 的缩写) 这个变量名表示 Vue 实例。
npm i vue
(小写)
const vm = new Vue({
// 指定 vue 管理的边界
el: '#app',
// 提供视图中 需要的数据
// 视图可以直接使用data中的数据
data: {
msg: 'xxx'
}
})
{{}}
从data
中获取数据,并展示在模板中{{}}
中只能出现 js 表达式1 'abc' false [] {}
1+2 arr.join('-') true ? 123 : 321
if语句 for语句
v-model 指令 : 数据双向绑定的指令
作用 : 把data中的msg值 和 input上的值 绑定到一起
注意 : v-model只能用在 表单控件上 (input checkbox 等)
> 可以在浏览器分别演示 V => M 和 M =>V
内在-响应式原理
let obj = {}
let temp
obj.name = 'zhanhgsan'
// 参数1 : 要给哪个对象设置属性
// 参数2 : 给对象设置什么属性
// 参数3 : 属性的修饰符
Object.defineProperty(obj, 'name', {
set: function(newVal) {
console.log('赋值了', newVal)
},
get: function() {
console.log('取值了')
return temp
}
})
//1. 拿到文本框
const txt = document.getElementById('txt')
//2. 时刻监听txt ,拿到最新的值
txt.oninput = function() {
console.log(this.value)
obj.name = this.value
}
//3. 数据模型
var obj = {}
let temp
Object.defineProperty(obj, 'name', {
// 给属性赋值的时候会掉
set: function(newVal) {
console.log('调用了set', newVal)
temp = newVal
txt.value = newVal
},
get: function() {
console.log('调用了get')
return temp
}
})
//1. 获取 input的值,最新值
//2. 通过监听oninput 拿到最新值
//3. 把最新值赋值给 obj.name
//4. 就会掉了set方法,就会修改了数据
//1. obj.name = 'xxx'
//2. 调用 set方法
//3. 把值赋值给input元素
说明 : 用在
表单
元素中, 用来实现数据双向绑定
(input checkbox 等等)
作用 : 将数据txt
和文本框的值
绑定到一起, 任何一方发生改变,都会引起对方的改变
注意 : v-model 在不同类型的表单元素中,该指令的作用不同
<input type="text" v-model="txt" />
<input type="checkbox" v-model="isChecked" />
说明 : 设置文本内容
msg1: '这是一条信息',
msg2: '我也是一条信息'
说明 : 动态绑定数据 (单向)
出现原因 : 在 HTML 属性中, 无法使用插值表达式
步骤:
// 加载静态数据
<a href="https://wbaidu.com">aaa</a>
// 想加载动态数据 {{ }}可以获取data中的数据
// 但是 {{}} 不能使用在属性中
<a href="{{ src }}">aaa</a>
// 所以使用v-bind
<a v-bind:href="{{ src }}">aaa</a> ok
<img v-bind:src="src"> ok
缩略 : v-bind 全部省略 只留下一个
:
改为 :
<a :href="src">aaaa> ok
<img :src="src" /> ok
// v-model : 数据双向绑定 表单元素上
// : : 动态绑定数据(单向) 任意元素动态读取属性
容易出错点 :
<input type="checkbox" v-model="isChecked1" /> <br />
<input type="checkbox" :checked="isChecked2" />*
1.操作样式
<h1 class="red">哈哈h1>
<h1 :class="cls">哈哈h1>
<h1 :class="{ red:isRed , fz:isFZ}">哈哈h1>
<h1 :style="{ color : 'red', fontSize : fz + 'px' }">哈哈h1>
2.其他操作
<div :class="{ active: true }">div>
===>
<div class="active">div>
<div :class="['active', 'text-danger']">div>
===>
<div class="active text-danger">div>
<div :class="[{ active: true }, errorClass]">div>
===>
<div class="active text-danger">div>
--- style ---
<h1 :style="{ color : 'red', fontSize : fz + 'px' }">哈哈h1>
<div :style="[baseStyles, overridingStyles]">div>
注册事件/绑定事件
: 后面是事件名称
<button v-on:click="fn">按钮button>
缩写 : @click=‘fn’
函数写在 methods
里面
fn : function(){ ... }
fn() { ... }
> 在函数里面操作数据
- 获取数据 this.msg
- 修改数据 this.msg = 'XXX'
@click='fn(123)'
5.2 事件对象 $event
<button @click="fn1($event,123)">我是按钮button>
<ul>
<li v-for="(item,index) in list1">{{ item }} - {{ index }}li>
ul>
<ul>
<li v-for="item in list2">{{ item.name }} - id:{{ item.id }}li>
ul>
<ul>
<li v-for="(item,key) in obj">{{ item }}-{{key}}li>
ul>
<h1 v-for="item in 10">我是h1 {{ item }}h1>
<h1 v-if="num > 40">第一个h1>
<h1 v-else>第三个h1>
<h1 v-if="num >= 40">第一个h1>
<h1 v-else-if="num >= 30 && num < 40">第二个h1>
<h1 v-else>第三个h1>
v-once 作用 : 告诉 vue 这个标签中的内容,只需要解析一次
即便是数据再发送改变, 那么,这个标签中的内容,也不会被更新
代码
比如说第一次登陆先显示登陆一欢迎信息
<p>{{ num }}p>
<p v-once>带 onece的 {{ num }}p>
<p>{{ num }}p>
<p v-pre>带 v-pre {{ num }}p>
1.代码
<h1 v-cloak>{{ msg }}h1>
[v-cloak] { display: none }
alert(1)
1.页面为什么会闪???闪是因为页面的内容 由 {{ msg }} ==> 100
2. 解决办法 : 使用遮盖
2.1 给要遮盖的元素添加一个 v-cloak 指令
2.2 使用属性选择器,添加样式
2.3 vue 会在解析模板后,将 v-cloak指定,从页面中移除,
移除指令的时候,{{}} 已经变为对应的数据