vue初识
定义:Vue.js是一套构建用户界面的框架,只关注视图层
Vue.js是前端的主流框架之一,和Angular2+、React.js一起,并成为前端三大主流框架!
优点:
1、使用框架,能够提高开发的效率
2、提高代码的维护性,提高效率
3、让用户不再操作DOM元素,解放了用户的双手,让程序员可以更多的时间去关注业务逻辑
4、响应式(数据的响应式)
框架与库的区别:
框架:是一套完整的解决方案;对项目的侵入性较大,项目如果需要更换框架,则需要重新架构整个项目。
库:提供某一个小功能,对项目的侵入性较小,如果某个库无法完成某些需求,可以很容易切换到其它库实现需求。
MVC与MVVM的区别
MVC是后端的分层开发概念;
MVVM是前端视图层的概念,主要关注于视图层分离,也就是说:MVVM把前端的视图层,分为了三部分Model、View、VMViewModel;
Vue.js 的代码结构
1、引入vue.js
2、写视图层,我们要展示的内容 (body里的html代码)
3、实例化Vue() var vm = new Vue ({})
data: 存放数据
el: 控制的是那块视图
methods: 放置响应方法
使用
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> </head> <body> <div id="app"> <!-- 插值表达式的概念 代表引用变量--> {{title}} </div> <div>描述</div> <div>{{intro}}</div> </body> <script> //创建vue的实例 var vm = new Vue({ //指定vue控制界面区域 ,只写id 唯一 el : "#app", //界面的数据 //之后我们在操作的时候更多的是操作数据,去影响界面宣染 // data:{ title:"hello vue", intro:"这是vue的介绍" } }) </script> </html>
插值表达式、v-cloak、v-text、v-html
插值表达式 {{}} 可以在内容前后插入一些内容
v-cloak : 当js运行完之后显示页面。
v-text:会替换掉元素里的内容
v-html:可以渲染html界面 (识别html标签)
<style> /* 属性选择器 */ /* 使js加载完成之后在显示页面 */ [v-cloak] { display: none; } </style> </head> <body> <div id="app"> <h3 v-cloak>{{title}}</h3> <!-- v-text覆盖原本的内容 --> <div v-text="intro">本来的内容</div> <!-- 插值内容前后 --> <div>{{intro}}本来的内容</div> <div v-html="richText"></div> </div> </body> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <script> //创建vue的实例 var vm = new Vue({ el: "#app", data: { title: "常用指令", intro: "v-text", richText:"<div>本来的内容</div>" } }) //插值表达式{{}},可以在前后插入一些内容 // v - text:会替换掉元素里的内容 // v
v-bind 界面元素属性值的绑定
1.括号里不加引号的都是我们data里的数据读取
2.如果想使用字符串需要加上引号
3.里面可以写表达式
4.里面也可以调用定义好的方法,拿到的是方法的返回值
使用:
<body> <div id="app"> <div v-bind:name="divName">标题</div> <input v-bind:type="inputType" value="点击"> </div> <script> /* v - bind 界面元素属性值的绑定 1.括号里不加引号的都是我们data里的数据读取 2.如果想使用字符串需要加上引号 3.里面可以写表达式 4.里面也可以调用定义好的方法,拿到的是方法的返回值 */ var vm = new Vue({ el: "#app", data: { divName: "title", inputType: "button" } }) </script>
v-on 进行事件的绑定,我们用的最多的是click事件绑定 简写@
<body> <div id="app"> <h3>{{title}}</h3> <!-- v-on:事件类型 = “函数名” --> <button v-on:click="changeTitle1">修改</button> <button @click="changeTitle">修改2</button> <button @dblclick="dbl">双击</button> </div> </body> <script> const vm = new Vue({ el: "#app", data: { title: "天亮教育" }, methods: { changeTitle() { console.log("点击"); console.log(this.title);//天亮教育 // console.log(title1);//实参 }, changeTitle1() { console.log("修改"); }, dbl() { console.log("双击了") } } }) </script>
事件修饰符:
.stop阻止冒泡
.prevent阻止默认事件
.capture添加事件侦听器时使用事件捕获模式
.self只当事件在该元素本身(比如不是子元素)触发时触发回调
.once事件只触发一次
//阻止事件冒泡 .box { width: 100px; height: 100px; background-color: red; } .box1 { width: 50px; height: 50px; background-color: blue; } </style> </head> <body> <div id="app"> <div class="box" @click="clickBox"> <div class="box1" @click.stop="clickInner"></div> </div> </div> </body> <script> const vm = new Vue({ el:"#app", data:{ }, methods: { clickBox() { console.log("点击了外盒子"); }, clickInner(){ console.log("点击的内盒子"); } } }) </script> //阻止默认事件 <body> <div id="app"> <a href="#" @click.prevent ="aclick">跳转</a> </div> </body> <script> var vm = new Vue({ el:"#app", data:{ }, methods:{ aclick(){ console("跳转") } } }) </script> //捕获模式 <body> <div id="app"> <div class="box" @click.capture="clickBox"> <div class="box1" @click.capture="clickInner"> <div class="box2" @click = "clickInner2"></div> </div> </div> </div> <!-- 捕获从外向里 --> </body> <script> const vm = new Vue({ el: "#app", data: { }, methods: { clickBox() { console.log("点击了外盒子"); }, clickInner() { console.log("点击的内盒子"); }, clickInner2() { console.log("点击了最内的盒子"); } } //只当事件在该元素本身(比如不是子元素)触发时触发回调 <body> <div id="app"> <div class="box" @click.self="clickBox"> <div class="box1" @click.self="clickInner"> <div class="box2" @click.self="clickInner2($event)"></div> </div> </div> </div> <!-- 捕获从外向里 --> </body> <script> const vm = new Vue({ el: "#app", data: { }, methods: { clickBox() { console.log("点击了外盒子"); }, clickInner() { // console.log(e.target) console.log("点击的内盒子"); }, clickInner2(e) { console.log(e.target) console.log("点击了最内的盒子"); } } }) </script> //事件只触发一次 <body> <div id="app"> <button @click.once="boxclick">点击</button> </div> </body> <script> var vm = new Vue({ el:"#app", data:{}, methods: { boxclick(){ console.log("点击"); } } })
v-model数据双向绑定
作用:数据双向绑定
注意:绑定的是表单控件
<body> <div id="app"> <!-- 作用:数据双向绑定 注意:绑定的是表单控件 --> <input type="text" v-model="num1"> <button @click = "btn">点击</button> </div> </body> <script> var vm = new Vue ({ el:"#app", data:{ num1:1 }, methods:{ btn(){ console.log(this.num1) } } }) </script>
V-for
1.便利数组,参数(item,index)inlist
2.便利对象,参数(value,key,index)inlist
3.便利数字,numin10(1~10)
<body> <div id="app"> {{title}} <ul> <!-- i为索引 item为内容 --> <input type="text" v-model="item1"> <button @click="search">检索</button> <li v-for="(item,i) in list" @click="show(item.name)" >id:{{item.id}} ----值:{{item.name}}</li> </ul> <ul> <li v-for="(item,i) in list1">id:{{item.id}} ----值:{{item.name}} </li> </ul> </div> </body> <script> const vm = new Vue({ el: "#app", data: { title: "hello", obj: { age: 10 }, list: [{ id: 1, name: "李白" }, { id: 2, name: "杜甫" }, { id: 3, name: "孟浩然" }], list1:[], item1: null }, methods:{ show(name){ alert(name); }, search(){ this.list1 = this.list.filter(item=>{ return item.name == this.item1; }) } } }) </script>