一套用于=构建用户界面的渐进式Javascript框架
尤雨溪
后起之秀,生态完善,已然成为国内前端工程师必备技能。
提示:
如果添加完还第一个提示,点击插件的“详情”,将“允许访问文件网址”打开即可。
代码:
<body>
<div id="root">
<h1>Hello,{{name}}, {{address}}h1>
div>
<script>
new Vue ({
el:"#root",
data:{
name:"Vue2.0",
address:"北京"
}
})
script>
body>
注意区分:js表达式和js代码(语句)
Vue模板语法有两大类:
功能:用于解析标签体内容
写法:{{xxx}},xxx是js表达式,且可以读取到data中的所有属性。
功能:用于解析标签(包括:标签属性,标签体内容,绑定事件)
举例:v-bind:href=“xxx” 或 简写为 :href=“xxx”,xxx 同样要写js表达式,且可以直接读取到data中的所有属性。
备注:Vue中有很多的指令,且形式都是:vue-???,此处我们只是拿v-bind举个例子
代码:
<body>
<div id="root">
<h1>插值语法h1>
<h3>你好,{{name}}h3>
<hr>
<h1>指令语法h1>
<h3>原始写法h3>
<a v-bind:href="school.url">点击前往{{school.name}}a>
<h3>简写h3>
<a :href="school.url">点击前往{{school.name}}a>
div>
<script type="text/javascript">
new Vue({
el: "#root",
data: {
name: 'Vue',
school: {
name: '百度',
url: 'https://www.baidu.com'
}
}
})
body>
Vue中有两种数据绑定的方式:
数据只能从data流向页面
数据不仅能从data流向页面,还可以从页面流向data
备注:
代码:
<body>
<div id="root">
单向数据绑定:<input type="text" :value="name"><br>
双向数据绑定:<input type="text" v-model="name">
div>
body>
<script type="text/javascript">
// 创建Vue实例
new Vue({
el:'#root',
data:{
name:'尚硅谷'
}
})
script>
观察发现:
代码:
<body>
<div id="root">
<h1>你好!{{name}}h1>
<button @click="showtip1">点击弹出提示(不传参)button>
<button @click="showtip2($event,666)">点击弹出提示(传参)button>
div>
body>
<script type="text/javascript">
const vm = new Vue({
el:'#root',
data:{
name:'Vue'
},
methods:{
showtip1(){
alert("111")
},
showtip2(event,number){
alert(number)
}
}
})
script>
代码:
<body>
<div id="root">
<h2>欢迎来到{{name}}学习h2>
<a href="http://www.atguigu.com" @click.prevent="showInfo">点我提示信息a>
<div class="demo1" @click="showInfo">
<button @click.stop="showInfo">点我提示信息button>
div>
<button @click.once="showInfo">点我提示信息button>
<div class="box1" @click.capture="showMsg(1)">
div1
<div class="box2" @click="showMsg(2)">
div2
div>
div>
<div class="demo1" @click.self="showInfo">
<button @click="showInfo">点我提示信息button>
div>
<ul @wheel.passive="demo" class="list">
<li>1li>
<li>2li>
<li>3li>
<li>4li>
ul>
div>
body>
<script type="text/javascript">
Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
new Vue({
el:'#root',
data:{
name:'尚硅谷'
},
methods:{
showInfo(e){
alert('同学你好!')
// console.log(e.target)
},
showMsg(msg){
console.log(msg)
},
demo(){
for (let i = 0; i < 100000; i++) {
console.log('#')
}
console.log('累坏了')
}
}
})
script>
代码:
<body>
<div id="root">
<h1>欢迎来到{{name}}h1>
<input type="text" placeholder="按下键盘键输出提示" @keydown.enter="showtip">
div>
body>
<script type="text/javascript">
const vm = new Vue({
el:'#root',
data:{
name:'尚硅谷'
},
methods:{
showtip(e){
console.log(e.target.value);
}
}
})
script>
代码:
<body>
<div id="root">
姓:<input type="text" v-model="firtName"><br>
名:<input type="text" v-model="lastName"><br>
全民:<span>{{firtName}}-{{lastName}}span>
div>
body>
<script type="text/javascript">
const vm =new Vue({
el:"#root",
data:{
firtName:'张',
lastName:'三'
}
})
script>
代码:
<body>
<div id="root">
姓:<input type="text" v-model="firtName"><br>
名:<input type="text" v-model="lastName"><br>
全民:<span>{{fullName()}}span>
div>
body>
<script type="text/javascript">
const vm = new Vue({
el: "#root",
data: {
firtName: '张',
lastName: '三'
},
methods:{
fullName(){
return this.firtName + '-' + this.lastName
}
}
})
script>
代码(完整写法):
<body>
<div id="root">
姓:<input type="text" v-model="firtName"><br>
名:<input type="text" v-model="lastName"><br>
全民:<span>{{fullName}}span>
div>
body>
<script type="text/javascript">
const vm = new Vue({
el: "#root",
data: {
firtName: '张',
lastName: '三'
},
computed:{
fullName:{
get(){
return this.firtName +'-'+ this.lastName
},
set(value){
const arr = value.split('-')
this.firtName=arr[0]
this.lastName=arr[1]
}
}
}
})
script>
代码(简写:只读写不修改的时候可以用):
<body>
<div id="root">
姓:<input type="text" v-model="firtName"><br>
名:<input type="text" v-model="lastName"><br>
全民:<span>{{fullName}}span>
div>
body>
<script type="text/javascript">
const vm = new Vue({
el: "#root",
data: {
firtName: '张',
lastName: '三'
},
computed:{
fullName(){
return this.firtName +'-'+ this.lastName
}
}
})
script>
代码:
<body>
<div id="root">
<h1>今天天气{{info}}h1>
<button @click="changeWeather">切换天气button>
div>
body>
<script>
// 创建一个Vue实例
new Vue({
el:"#root",
data:{
isHot:true
},
computed:{
info(){
return this.isHot?'炎热':'凉爽'
}
},
methods: {
changeWeather(){
this.isHot = !this.isHot
}
},
})
script>
监视属性watch:
代码:(正常写法)
<script>
// 创建一个Vue实例
const vm = new Vue({
el: "#root",
data: {
isHot: true
},
computed: {
info() {
return this.isHot ? '炎热' : '凉爽'
}
},
methods: {
changeWeather() {
this.isHot = !this.isHot
}
},
// 第一种写法:在Vue实例中传入watch配置(正常写法)
watch: {
isHot: {
immediate: true,//初始化时让handler调用
handler(newValue, oldValue) {
console.log('isHot被修改了', newValue, oldValue);
}
},
// 第一种写法:在Vue实例中传入watch配置(简写)
isHot(newValue, oldValue) {
console.log('isHot被修改了', newValue, oldValue);
}
}
})
// 第二种写法:通过vm.$watch监视(正常写法)
vm.$watch('isHot', {
immediate: true,//初始化时让handler调用
handler(newValue, oldValue) {
console.log('isHot被修改了', newValue, oldValue);
}
})
// 第二种写法:通过vm.$watch监视(简写)
vm.$watch('isHot', function (newValue, oldValue) {
console.log('isHot被修改了', newValue, oldValue);
})
script>
<body>
<div id="root">
<div class="basic" :class="mood" @click="changeMood">{{name}}div> <br/><br/>
<div class="basic" :class="classArr">{{name}}div> <br/><br/>
<div class="basic" :class="classObj">{{name}}div> <br/><br/>
<div class="basic" :style="styleObj">{{name}}div> <br/><br/>
<div class="basic" :style="styleArr">{{name}}div>
div>
body>
<script type="text/javascript">
Vue.config.productionTip = false
const vm = new Vue({
el:'#root',
data:{
name:'尚硅谷',
//绑定class样式--字符串写法
mood:'normal',
//绑定class样式--数组写法
classArr:['atguigu1','atguigu2','atguigu3'],
//绑定class样式--对象写法
classObj:{
atguigu1:false,
atguigu2:false,
},
//绑定style样式--对象写法
styleObj:{
fontSize: '40px',
color:'red',
},
styleObj2:{
backgroundColor:'orange'
},
//绑定style样式--数组写法
styleArr:[
{
fontSize: '40px',
color:'blue',
},
{
backgroundColor:'gray'
}
]
},
methods: {
changeMood(){
const arr = ['happy','sad','normal']
const index = Math.floor(Math.random()*3)
this.mood = arr[index]
}
},
})
script>
代码:
<body>
<div id="root">
<h2>当前的n值是:{{n}}h2>
<button @click="n++">点我n+1button>
<template v-if="n === 1">
<h2>你好h2>
<h2>尚硅谷h2>
<h2>北京h2>
template>
div>
body>
<script type="text/javascript">
Vue.config.productionTip = false
const vm = new Vue({
el:'#root',
data:{
name:'尚硅谷',
n:0
}
})
script>
v-for指令:
代码:
<body>
<div id="root">
<h1>遍历数组h1>
<ul>
<li v-for="(p,index) in persons" :key="index">
{{p.name}}--{{index}}
li>
ul>
<h1>遍历对象h1>
<ul>
<li v-for="(c,index) in car" :key="index">
{{c}}--{{index}}
li>
ul>
<h1>遍历字符串h1>
<ul>
<li v-for="(z,index) in str" :key="index">
{{z}}--{{index}}
li>
ul>
div>
body>
<script>
// 创建一个Vue实例
const vm = new Vue({
el: '#root',
data: {
// 遍历数组
persons: [
{ id: '001', name: '张三', age: 18 },
{ id: '002', name: '李四', age: 19 },
{ id: '003', name: '王五', age: 20 }
],
// 遍历对象
car: {
name: '奥迪A8',
price: '70万',
color: '黑色'
},
// 遍历字符串
str: 'hello'
}
})
script>
面试题:react、vue中的key有什么作用?(key的内部原理)
代码:
<body>
<div id="root">
<h2>人员列表h2>
<input type="text" placeholder="请输入名字" v-model="keyWord">
<ul>
<li v-for="(p,index) of filPerons" :key="index">
{{p.name}}-{{p.age}}-{{p.sex}}
li>
ul>
div>
<script type="text/javascript">
Vue.config.productionTip = false
//用watch实现
//#region (折叠)
/* new Vue({
el:'#root',
data:{
keyWord:'',
persons:[
{id:'001',name:'马冬梅',age:19,sex:'女'},
{id:'002',name:'周冬雨',age:20,sex:'女'},
{id:'003',name:'周杰伦',age:21,sex:'男'},
{id:'004',name:'温兆伦',age:22,sex:'男'}
],
filPerons:[]
},
watch:{
keyWord:{
immediate:true,//进入页面就执行一次代码
handler(val){//val为新的值
this.filPerons = this.persons.filter((p)=>{
return p.name.indexOf(val) !== -1//有这个值
})
}
}
}
}) */
//#endregion
//用computed实现
new Vue({
el:'#root',
data:{
keyWord:'',
persons:[
{id:'001',name:'马冬梅',age:19,sex:'女'},
{id:'002',name:'周冬雨',age:20,sex:'女'},
{id:'003',name:'周杰伦',age:21,sex:'男'},
{id:'004',name:'温兆伦',age:22,sex:'男'}
]
},
computed:{
filPerons(){
return this.persons.filter((p)=>{
return p.name.indexOf(this.keyWord) !== -1
})
}
}
})
script>
<body>
<div id="root">
<h2>人员列表h2>
<input type="text" placeholder="请输入名字" v-model="keyWord">
<button @click="sortType = 2">年龄升序button>
<button @click="sortType = 1">年龄降序button>
<button @click="sortType = 0">原顺序button>
<ul>
<li v-for="(p,index) of filPerons" :key="p.id">
{{p.name}}-{{p.age}}-{{p.sex}}
<input type="text">
li>
ul>
div>
<script type="text/javascript">
Vue.config.productionTip = false
new Vue({
el:'#root',
data:{
keyWord:'',
sortType:0, //0原顺序 1降序 2升序
persons:[
{id:'001',name:'马冬梅',age:30,sex:'女'},
{id:'002',name:'周冬雨',age:31,sex:'女'},
{id:'003',name:'周杰伦',age:18,sex:'男'},
{id:'004',name:'温兆伦',age:19,sex:'男'}
]
},
computed:{
filPerons(){
const arr = this.persons.filter((p)=>{
return p.name.indexOf(this.keyWord) !== -1
})
//判断一下是否需要排序
if(this.sortType){
arr.sort((p1,p2)=>{
return this.sortType === 1 ? p2.age-p1.age : p1.age-p2.age
})
}
return arr
}
}
})
script>
特别注意:Vue.set() 和 vm.$set() 不能给vm 或 vm的根数据对象 添加属性!!!
收集表单数据:
,则v-model收集的是value值,用户输入的就是value值。
,则v-model收集的是value值,且要给标签配置value值。
备注:v-model的三个修饰符:
过滤器:
自定义指令总结:
(1).局部指令:
new Vue({
directives:{指令名:配置对象}
})
或:
new Vue({
directives{指令名:回调函数}
})
(2).全局指令:
Vue.directive(指令名,配置对象) 或 Vue.directive(指令名,回调函数)
代码:
<body>
<div id="root">
<h2>{{name}}h2>
<h2>当前的n值是:<span v-text="n">span> h2>
<h2>放大10倍后的n值是:<span v-big="n">span> h2>
<button @click="n++">点我n+1button>
<hr />
<input type="text" v-fbind:value="n">
div>
body>
<script type="text/javascript">
Vue.config.productionTip = false
//定义全局指令
/* Vue.directive('fbind',{
//指令与元素成功绑定时(一上来)
bind(element,binding){
element.value = binding.value
},
//指令所在元素被插入页面时
inserted(element,binding){
element.focus()
},
//指令所在的模板被重新解析时
update(element,binding){
element.value = binding.value
}
}) */
new Vue({
el: '#root',
data: {
name: '尚硅谷',
n: 1
},
directives: {
//big函数何时会被调用?1.指令与元素成功绑定时(一上来)。2.指令所在的模板被重新解析时。
/* 'big-number'(element,binding){
// console.log('big')
element.innerText = binding.value * 10
}, */
big(element, binding) {
console.log('big', this) //注意此处的this是window
// console.log('big')
element.innerText = binding.value * 10
},
fbind: {
//指令与元素成功绑定时(一上来)
bind(element, binding) {
element.value = binding.value
},
//指令所在元素被插入页面时
inserted(element, binding) {
element.focus()
},
//指令所在的模板被重新解析时
update(element, binding) {
element.value = binding.value
}
}
}
})
script>
常用的生命周期钩子:
关于销毁Vue实例: