打开Vue的新大门(Vue.js从入门到精通)第一页


前言

Vue前端学习迫在眉睫!!!!!话不多说,直接开始!


一、搭建Vue开发环境

1.下载vue

vue有两个版本:
vue版本
开发版本(vue.js)可以在代码出现错误的时候出现提示改正,而生产版本(vue.min.js)则不会出现任何提示。
因此我们在实际开发的时候一般选择开发版本进行下载安装,等产品上线的时候,为了减少项目的大小,可以换为生产版本。
下载地址:
https://v2.cn.vuejs.org/v2/guide/installation.html

2.引入vue:

两种方式:

1<script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script>2<script type="text/javascript" src="../js/vue.js"></script>//src指的是你自己下载的vue放置的地址。

二、初识Vue

初识vue
上图中的root容器是代指id或者class为root的容器。

注意: 区分js表达式和js代码(语句)
(1)js表达式:表示产生一个值,可以放在任何需要值的位置。例如:a,1+1,三目表达式:x === y ? ‘a’ : 'b’等。
(2)js代码(语句):例如if(){},for(){}。
(3)js表达式是特殊的js代码。

简单代码示例如下:

1.root容器
<div id="root">
   <h1>hello,{{name}},{{address}},{{Date.now()}}</h1>
</div>
2.vue实例
<script type="text/javascript">
   new Vue({
        el:'#root',//el用于指定当前Vue实例为那个容器服务,值通常为css选择器字符串
        data: {//存储数据,供el所制定的容器去使用
            name:'ZhangSan',
            address:'http://andisnai.com'
        }
    })

页面展示如下:
页面展示

三、Vue模板语法

1.插值语法
  • 功能:解析标签体内容(标签体:起始标签与结束标签中间夹着的内容,例如:<h1>插值语法</h1>中的“插值语法”即为标签体内容)
  • 写法:{{xxx}},xxx为js表达式,并且可以读取到vue实例中data中的所有属性

示例如下:

<div id="root">
	<h3>你好,{{name}}</h3>
</div>
new Vue({
        el:'#root',
        data:{
            name:'jack',
        }
    })

注意:
插值语法的使用时机:如果想要放值的地方处于标签体中时,则可用插值语法。

2.指令语法
  • 功能:解析标签(包括:标签属性、标签体内容、绑定事件等)
  • 例如:v-bind:href=“xxx” 可以简写成 :href=“xxx” ,xxx也指js表达式,并且可以读取到vue实例中data中的所有属性

示例如下:

<div id="root">
	<a v-bind:href="url">点我跳转</a>
</div>
new Vue({
        el:'#root',
        data:{
            url:'http://www.baidu.com'
        }
    })

注意:
如果使用插值语法时有多个相同名字的属性值,那么处理方法就是:
(1)在data里把相同名字的属性改为不同名字
(2)在data里把相同名字的属性划分成不同层级
示例:

new Vue({
     el:'#root',
       data:{
           name:'jack',
           school:{
              name:'marry',
           }
       }
   })

使用“jack”时用{{name}}即可,使用“marry”时,使用{{school.name}}

四、Vue数据绑定

1.单向数据绑定
  • 单向绑定:数据只能从data流向页面
  • 语法:v-bind

示例:

单向数据绑定:<input type="text" v-bind:value="name">

注意:此时name指data中的name属性

原理图解:单向数据绑定

注意:
(1)改变input框里的值不会改变其value值。
(2)v-bind:value=“name” 可以简写成 :value=“name” 。

2.双向数据绑定
  • 单向绑定:数据不仅能从data流向页面,也可以从页面流向data
  • 语法:v-model

示例:

双向数据绑定:<input type="text" v-model:value="name">

原理图解:
双向数据绑定

注意:
(1)改变input框里的值会改变其value值,同时绑定该value值的地方也会一起改变。
(2)双向绑定一般只用在表单类元素上,例如input,select等。
(3)v-model:value=“name” 可以简写为 v-model=“name” ,因为其默认收集的就是value的值。

五、el和data的两种写法

1.el的两种写法
  • new Vue的时候配置el:‘#root’
  • 先创建Vue实例,然后再通过v.$mount(‘#root’)指定el的值

v.$mount(‘#root’)示例:

const v = new Vue({
      //el: "#root",
      data: {
        name: "尚硅谷",
      },
    });
 v.$mount('#root')
2.data的两种写法
  • 对象式:data:{name:‘xxx’}
  • 函数式:data:function(){return{name:‘xxx’}}或者data(){return{name:‘xxx’}}

注意: 由Vue管理的函数不能写成箭头函数,一旦写为箭头函数,那么this就不再是Vue实例了。

六、MVVM模型

MVVM
从代码角度理解:
代码展示

注意:
(1)data中的所有属性,最后都出现在了vue实例vm身上。
(2)vm身上的所有属性以及Vue原型上的所有属性,在Vue模板中均可以直接使用。

七、Vue数据代理

1.Object.defineproperty方法
  • 作用:给某个对象增加某个属性
  • 参数:对象属性名配置项(value、enumerable、writable、configurable等)

示例:需求:给person对象添加age属性,并通过number进行赋值,同时改变number的值时,age的值也随之改变,代码如下:

let number = 10
let person = {
	name:'张三'
	sex:'男'
}
Object.defineproperty(person,'age',{
	//value:20
	//enumerable:true//控制属性是否可以枚举,默认值是false
	//writable:true//控制属性是否可以被修改,默认值是false
	//configurable:true//控制属性是否可以被删除,默认值是false
	//当有人读取person的age属性时,get函数(getter)会被调用,且返回值是age的值
	get(){
		return number
	}
	//当有人修改person的age属性时,set函数(setter)会被调用,且会收到修改的具体值
	set(value){
		number = value
	}
})
2.数据代理原理

数据代理:通过一个对象代理对另一个对象属性的操作(读/写)

示例:需求,通过对象obj2代理对象obj1中的x属性,代码如下:

let obj1 = {x:100}
let obj2 = {y:1000}
//给obj2添加一个x属性
Object.defineproperty(obj2,'x',{
	//当有人读取obj2的x属性时,get函数(getter)会被调用,此时读取的其实是obj1的x属性。
	get(){
		return obj1.x
	}
	//当有人修改obj2的x属性时,set函数(setter)会被调用,且会收到修改的具体值,此时修改的也是obj1的x属性。
	set(value){
		obj1.x = value
	}
})

读取obj2的x:
读取
修改obj2的x,obj1的x也会改变:
修改

3.Vue数据代理原理图

在这里插入图片描述
Vue经过一系列与2.相同的操作实现数据代理。

八、Vue事件处理

1.事件的基本使用

语法:
(1)容器中标签添加v-on:xxx 或者 @xxx 绑定事件,其中xxx是事件名。
(2)Vue实例中添加配置项methods:{yyy},yyy是所定义的方法,方法的语法为:方法名(){}
示例:
a.给按钮绑定事件:

 <button v-on:click="showInfo">点我提示信息</button>

b.给vue实例添加showInfo方法:

new Vue({
      el: "#root",
      data: {
        name: "尚硅谷",
      },
      methods:{
            showInfo(){
                alert('你好,同学')
            }
        },
    });

注意:
(1)事件回调(方法)要配置在methods中,且不要用箭头函数。
(2)methods中的函数都是被Vue所管理的,this指向的是vm或组件实例对象。
(3)@click="demo"@click = "demo($event)"效果一致,但后者可以传参。
(4)传参时:若写为@click = "demo(a)",则传过去的参数是a,但是event对象就丢了,为了保证event不丢,可以写为@click = "demo(a,$event)",其中$event传的参数是event对象。

2.事件修饰符
  • prevent:阻止默认事件(常用)
  • stop:阻止事件冒泡(常用)
  • once:事件只触发一次(常用)
  • capture:使用事件的捕获模式
  • self:只有event.target是当前操作的元素才会触发事件
  • passive:事件的默认行为为立即执行,无需等待事件回调执行完毕(移动端使用多)

示例:

//通过prevent修饰符阻止a标签默认的点击后跳转事件。
<a href="http://www.baidu.com" @click.prevent="showInfo">点我提示信息</a>

//如果不加stop,则点击按钮后会执行一次showInfo,然后冒泡到div,再执行一次showInfo。通过stop修饰符阻止点击按钮后事件冒泡到div。
<div class="demo1" @click="showInfo">
     <button @click.stop="showInfo">点我提示信息</button>
</div>

//通过once修饰符使得点击事件只触发一次。
<button @click.once="showInfo">点我提示信息</button>

//js事件流分为捕获阶段和冒泡阶段,事件处理是冒泡阶段做的。
//捕获阶段是从外向内进行捕获,冒泡阶段是从内向外冒泡。
//以下方代码为例,如果不加capture修饰符,则点击div2,控制台输出的是2,1;如果加了capture修饰符,则点击div2后控制台输出的是1,2。
<div class="box1"  @click="showMsg(1)">       		       
 	div1
  <div class="box2"  @click="showMsg(2)">
       div2
   </div>
</div>

注意: 修饰符可以连续写,例如:先阻止默认事件,再阻止事件冒泡。

<a href="http://www.baidu.com" >@click.prevent.stop="showInfo">点我提示信息</a>
3.键盘事件

(1)@keyup和@keydown
(2)Vue中常用的按键别名:

  • enter:回车键
  • delete:删除键(del)和退格键(平常用的删除键)
  • esc:退出
  • space:空格
  • tab:换行(必须配合keydown使用
  • up:(方向键)上
  • down:(方向键)下
  • left:(方向键)左
  • right:(方向键)右

示例:

<!--按下回车键后执行showAn方法  -->
<input type="text" placeholder="按下回车键提示输出" @keyup.enter="showAn">

注意:
(1)Vue未提供别名的按键可以用console.log(event.key,event.keyCode)获取按键的名字和编码,然后再使用,例如按下回车键输出如下:
按键名称和编码
(2)当按键名由多个单词组成时,使用时要把字母都变为小写,并在两个单词中间加“-”,例如:转变大小写键:CapsLock在使用时变为caps-lock,例如:@keyup.caps-lock=“showInfo”。

(3)系统修饰键(用法特殊):ctrlaltshiftmeta(win键)

  • a.配合keyup使用,按下修饰键的同时,再按下其他键,随后释放其它键,事件才被触发。
  • b.配合keydown使用时,正常触发事件。

注意: 如果指定某两键才可以触发事件,例如ctrl+y键才可以触发事件,写法如下:
@keyup.ctrl.y=“showInfo”

(4)也可以使用keycode去指定具体的按键(不推荐,因为该特性已经从web标准中删除了),例如:

<!--按下回车键后执行showAn方法  -->
<input type="text" placeholder="按下回车键提示输出" @keyup.13="showAn">

(5)用“Vue.config.keyCodes.自定义键名 = 键码”,可以定制按键别名。
例如:给回车键定义一个别名“huiche”:

//13是回车键的编码
Vue.config.keyCodes.huiche = 13

九、Vue计算属性

1.调用methods中的方法

示例:

<!-- 调用的时候用插值语法,{{}}中写:函数名() -->
<span>{{name()}}</span>
const vm = new Vue({
      el: "#root",
      data: {
      },
      methods: {
        name(){
          return 'Marry'
        }
      },
    });
2.计算属性

计算属性:通过对已有属性进行加工、计算等操作后得到的属性是计算属性。(例如下方代码中, first_name和last_name是属性,full_name是计算属性)
语法:使用配置项computed(写为对象形式),然后在该配置项内把计算属性也写为对象形式,{}里要写get()和set()。
示例:

<span>{{full_name}}</span>
const vm = new Vue({
      el: "#root",
      data: {
        first_name:"张",
        last_name:"三"
      },
      computed:{
        full_name:{
            get(){
                return this.first_name + '-' + this.last_name
            },
            set(value){
                const arr = value.split('-')
                //this是vm
                this.first_name = arr[0]
                this.last_name = arr[1]
                return 
            }
        }
      }
    });

代码解释:
(1)当读取full_name或者所依赖的数据发生变化时,就会调用get,且返回值作为full_name的值。
(2)当修改full_name时,就会调用set,且返回值作为full_name的值。(如果计算属性要被修改,则必须写set()去响应式修改,且set中要引起计算时依赖的数据发生改变)

注意:
(1)使用计算属性时,由于其内部有缓存机制(复用),只调用一次get(),但是使用methods方法时,没有缓存机制,因此会多次调用对应方法。
(2)data和methods里面写什么,vm里面就是什么,但是computed里面写的内容,在放到vm上的时候,先自动找到get(),然后把返回值放到vm上,名字为对应的计算属性名。
(3)计算属性最终会出现在vm上,直接读取即可。

3.计算属性的简写

简写:省略set()时,可以进行简写。
示例:

full_name:function(){
......
}

full_name(){
......
}

full_name:{
	get(){......}
}

上述三种写法实现效果一样。

十、Vue监视属性

1.watch的第一种配置方式

new Vue时传入watch配置。

示例:
点击按钮实现天气情况切换:

<div id="root">
     <h1>今天天气真{{info}}!</h1>
     <button @click="changeWeather">切换天气</button>
</div>
 const vm = new Vue({
      el: "#root",
      data: {
        isHot:true
      },
      methods: {
        changeWeather(){
            this.isHot = !this.isHot
        }
      },
      computed:{
        info(){
            return this.isHot?"炎热":"凉爽"
        }
      },
      watch:{
        isHot:{
          immediate:true,
          handler(newValue,oldValue){
            console.log('isHot被修改了',newValue,oldValue)
          }
        }
      }  
    });

代码解释:
(1)immediate:true,//初始化时让handler调用一下。
(2)当isHot改变的时候调用handler。
(3)newValue,oldValue分别是修改后的内容和修改前的内容。

效果展示如下:
效果展示

2.watch的第二种配置方式

通过vm.$watch监视。

示例:

 vm.$watch('isHot',{
      immediate:true,
      handler(newValue,oldValue){
            console.log('isHot被修改了',newValue,oldValue)
          }
    })
3.深度监视

Vue默认可以进行多级监视,但是Vue中的watch默认只监视第一级,不监视对象内部值的改变,但是配置deep:true后就可以监视对象内部值的改变,即进行多级监视。
示例:
要监视data中numbers中a和b的变化:

 data: {
        isHot: true,
        numbers:{
          a:1,
          b:1
        }
      }
'numbers.a':{
        handler(){
          console.log('a的值改变了');
        }
      },
'numbers.b':{
        handler(){
          console.log('a的值改变了');
        }
      }

但是如果numbers内的属性有很多时,就不方便一个个编写了,可以用下面的方法,直接对numbers内的所有属性进行监视。

 watch: {
      numbers:{
        deep:true,
        handler(){
          console.log('numbers的值改变了');
        }
      }
}
4.监视的简写

简写的前提:不需要设置immediate和deep,只有handler时。
(1)正常写法1:

isHot: {
          handler(newValue, oldValue) {
            console.log("isHot被修改了", newValue, oldValue);
          }
 }

简写1(把属性名直接当做handler使用):

 isHot(newValue,oldValue){
            console.log("isHot被修改了", newValue, oldValue);
 }

(2)正常写法2:

vm.$watch('isHot',{
      handler(newValue,oldValue){
            console.log('isHot被修改了',newValue,oldValue)
      }
})

简写2:

vm.$watch('isHot',function(newValue,oldValue){
      console.log("isHot被修改了", newValue, oldValue);
})
5.监视(watch)与计算属性(computed)对比

computed能完成的功能,watch都能完成,但是watch能完成的功能,computed不一定可以完成,例如:watch可以进行异步操作,而computed不可以。

小原则:
(1)被Vue管理的函数最好写成普通函数,这样this指向是vm或者组件实例对象。
(2)所有不被Vue管理的函数(定时器的回调函数、ajax的回调函数、Promise的回调函数等),最好写成箭头函数,这样this指向是vm或者组件实例对象。

总结

以上就是打开Vue的新大门的第一页笔记,希望能和对前端感兴趣的友友们一起学习进步,作者也在学习中,如有解释不清楚或有误的地方,还请各位指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值