vue介绍
vue是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。
vue特点
mvvm:双向数据绑定 mv vm 无需关注 dom操作(无需关注视图),只需要关注数据即可
组件化:组件 页面上的 公共小单元(如 网页头部 商品卡片)
vue基本语法
首先用script标签引入vue.js
let vm = new Vue({
el:"#box",
data:{ //用于存放vue的状态
msg:123
}
})
vue mvvm原理
利用es5 defineProperty()
拦截 数据的设置和获取,动态的改变视图
vue模板的语法
注意:
1,不能写语句
var a=10;
a+b
2,能不能流程控制 不能写流程控制 只能写三目 或者短路
3,模板中 js全局变量有些可以使用有些不可以使用(vue有一个白名单)
vue外部挂载实例
let vm = new Vue({
data:{
msg:123
}
})
vm.$mount(document.querySelector("#box"));
vue中的指令
vue 扩展了 标签属性的功能,赋予它一些特殊的功能
语法: v-指令名字
使用方法:同标签的属性
v-model 将表单的值 与 data中的状态 进行 双向绑定
v-text 将元素的内容 与data状态进行双向绑定
v-html 将内容解析成 html (慎重使用,一般后台返回富文本内容时使用)
v-bind:属性 扩展了是任意属性(可以包括自定义属性,也可以是标签默认的属性)
干了什么事:
将属性的值 变成动态的值,和 vue的data中的state进行绑定
简写: :属性
v-on:事件
将元素的事件 与 methods中的方法进行绑定(方法变成事件函数)
事件调用时 全局变量 $event 保存了事件对象
简写: @事件
注意:
vue
v-on:事件="这里不适合写过多的业务逻辑代码"
{{ 也不适合写过多的业务逻辑代码 }}
原因:
只能使用一些简单的表达式,不能写语句,不能使用 逻辑控制语句,很多js全局变量也不能使用(白名单里面的才能用)
视图 中一般只简单的展示数据,调用命令,不适合 写过多的业务逻辑代码,否则会造成,代码混乱(高耦合)
vue中的事件修饰符
修饰符是由点开头的指令后缀来表示的。赋予了事件一些特殊的功能 addEventListener("事件名",函数,true/false)
.stop 阻止事件冒泡
.prevent 阻止默认事件
.capture 在捕获阶段触发
.self 只能通过元素本身触发,后代元素无法触发
.oncvuee 只触发一次
vue条件渲染
v-if
v-else-if
v-else
1,当元素消失时不出来时。v-show 是display:none v-if直接dom移除节点
都有啥使用场景:
场景1: 代码块 代码很多,默认是不显示的,后面有条件的显示 v-if
首次加载 惰性的
Vue组件 component
vue: 组件也是Vue实例 (实例的属性 组件都有)
如何定义一个组件
let CommonHeader = {
template:""
data(){
return{
},
methods:{
}
如何区分全局组件和局部组件? 在Vue上注册的就是全局组件 在某个组件或者实例中注册的就是局部组件
全局组件
在任意的组件和实例上使用
Vue.component("组件名",{
template:"",
data(){
return {
},
methods:{
})
局部组件 只能在注册的组件或者实例上使用
1,组件中的data 必须是 一个函数 返回一个对象
2,每个组件有自己的作用域,组件内部的数据,和方法只能在组件内部使用(如向跨组件,需要组件间通信)
3,组件的命名 可以有两种 1大驼峰 2下划线命名法
eg:
CommonHead common-head
使用时二者都一样
<common-head></common-head>
4,局部组件 在哪个组件的components中注册,就只能在这个组件的template中使用
5,组件的template 有且只能有一个根标签(元素)
组件间的关系:父向子
在子组件中 定义props属性 值是一个数组 数组中 每个元素,就是 从父组件接收的 数据
子组件
let CommonHead={
template:`
<div>
<h1>我是 {{title}} 的标题</h1>
<h2>我是 {{ subTitle }} </h2>
</div>
`,
props:['title',"subTitle"]
}
在父组件中 使用 子组件 的自定义标签中 通过 属性的形式 传入 父组件的数据
父组件
let Home = {
template:`
<div>
<h4>我是home组件</h4>
<common-head :title="myTitle" :subTitle=" '我是home组件副标题' "></common-head>
</div>
`,
data(){
return {
myTitle:"首页组件"
}
},
components: {
CommonHead
}
}
上面的props用法,没有校验 props数据类型,以及必须填写,默认值 等,会造成 程序 存在 不稳定性 (代码不健壮)
数据类型
String
Number
Boolean
Array
Object
Date
Function
Symbol
必须填写
required:true/false 如果为false 就别写了
默认值:
default
注意:props 不再是数组 而是对象
a:String,
b:{
type:String,
required:true
},
c:{
type:Number,
default:0
}
}
注意:
1,当 一个数组 类型为 数据的时候 传数据时,不能直接静态传一个数据(传的是字符串)
2,数据类型为 Array,或者Object 默认值 必须是一个 函数 返回一个默认值
3,props 能在子组件中 直接改变值吗? 不能(单向数据流)
子向父传参
名字 Child组件
this.$emit("事件名",携带的数据)
父组件 Parent中使用
<child @事件名="fn"></child>
methods:{
fn(data){
data就是子组件传过来的数据
}
}
}
兄弟之间组件传参
原理:利用一个第三方的 组件 进行弹射事件,且 进行接收事件
let bus = new Vue();
弹射:
bus.$emit("事件名字",携带的参数)
监听事件:
bus.$on(事件名,回调函数)