vue2基础知识--第1节

Vue 目录结构

目录解析
img

目录/文件说明
build项目构建(webpack)相关代码
config配置目录,包括端口号等。我们初学可以使用默认的。
node_modulesnpm 加载的项目依赖模块
src这里是我们要开发的目录,基本上要做的事情都在这个目录里。里面包含了几个目录及文件:assets: 放置一些图片,如logo等。components: 目录里面放了一个组件文件,可以不用。A==pp.vue: 项目入口文件,==我们也可以直接将组件写这里,而不使用 components 目录。main.js: 项目的核心文件
static静态资源目录,如图片、字体等。
test初始测试目录,可删除
.xxxx文件这些是一些配置文件,包括语法配置,git配置等。
index.html首页入口文件,你可以添加一些 meta 信息或统计代码啥的
package.json项目配置文件。
README.md项目的说明文档,markdown 格式

声明式编码

⚡️⚡️学习vue之前要掌握JavaScript基础知识!
🚀🚀🚀🚀具体教程见:JavaScript基础&高级教程🚀🚀🚀🚀

在这里插入图片描述

一、初识Vue

1、想让Vue工作,就必须创建一个Vue实例,且要传入一个配置对象;

2、root容器里的代码依然符合html规范,只不过混入了一些特殊的Vue语法;

3、root容器里的代码被称为【Vue模板】;

4、Vue实例和容器是一一对应的; 数据是动态的,不用再次更新

5、真实开发中只有一个Vue实例,并且会配合着组件一起使用;

6、{{xxx}}中的xxx要写js表达式,且xxx可以自动读取到data中的所有属性;

7、一旦data中的数据发生改变,那么页面中用到该数据的地方也会自动更新;

​注意区分:js表达式 和 js代码(语句)

1.表达式
一个表达式会产生一个值,可以放在任何一个需要值的地方:

(1). a

(2). a+b

(3). demo(1) 函数调用表达式

(4). x === y ? 'a' : 'b'

2.js代码(语句)

(1). if(){}

(2). for(){}

二、Vue模板语法有2大类

1、插值语法

功能:用于解析标签体内容

写法:{{xxx}},xxx是js表达式,且可以直接读取到data中的所有属性。

2、指令语法

功能:用于解析标签(包括:标签属性、标签体内容、绑定事件…)。

举例:v-bind:href="xxx" 或 简写为:href="xxx",xxx同样要写js表达式,且可以直接读取到data中的所有属性。

备注:Vue中有很多的指令,且形式都是:v-xxxx,此处我们只是拿v-bind举个例子。

学过的指令:

​ v-bind : 单向绑定解析表达式, 可简写为 :xxx

​ v-model : 双向数据绑定

​ v-for : 遍历数组/对象/字符串

​ v-on : 绑定事件监听, 可简写为@

​ v-if : 条件渲染(动态控制节点是否存存在)

​ v-else : 条件渲染(动态控制节点是否存存在)

​ v-show : 条件渲染 (动态控制节点是否展示)

v-text指令:

​ 1.作用:向其所在的节点中渲染文本内容。

​ 2.与插值语法的区别:v-text会替换掉节点中的内容,{{xx}}则不会。

v-html指令:

1.作用:向指定节点中渲染包含html结构的内容。

2.与插值语法的区别:

(1).v-html会替换掉节点中所有的内容,{{xx}}则不会。

(2).v-html可以识别html结构。

3.严重注意:v-html有安全性问题!!!!

(1).在网站上动态渲染任意HTML是非常危险的,容易导致XSS攻击。

(2).一定要在可信的内容上使用v-html,永不要用在用户提交的内容上!

三、Vue中有2种数据绑定的方式

1、单向绑定(v-bind)

数据只能从data流向页面。

2、双向绑定(v-model)

数据不仅能从data流向页面,还可以从页面流向data。

备注:

1.双向绑定一般都应用在表单类元素【输入类元素,和用户产生交互】上(如:input、select等)

2.v-model:value 可以简写为 v-model,因为v-model默认收集的就是value值。

四、data与el的2种写法

1、el有2种写法

(1). new Vue时候配置el属性。

(2). 先创建Vue实例,随后再通过vm.$mount('#root')指定el的值。

2、data有2种写法

(1). 对象式

(2). 函数式

如何选择:目前哪种写法都可以,以后学习到组件时,data必须使用函数式,否则会报错。

3、一个重要的原则

由Vue管理的函数,一定不要写箭头函数,一旦写了箭头函数,this就不再是Vue实例了。

五、MVVM模型

  1. M:模型(Model) :data中的数据

  2. V:视图(View) :模板代码

  3. VM:视图模型(ViewModel):Vue实例

观察发现:

  1. data中所有的属性,最后都出现在了vm身上。

  2. vm身上所有的属性 及 Vue原型上所有属性,在Vue模板中都可以直接使用。

1.Vue中的数据代理:

​ 通过vm对象来代理data对象中属性的操作(读/写)

2.Vue中数据代理的好处:

​ 更加方便的操作data中的数据

3.基本原理:

通过Object.defineProperty()把data对象中所有属性添加到vm上。

为每一个添加到vm上的属性,都指定一个getter/setter

getter/setter内部去操作(读/写)data中对应的属性。

1、Html

使用 v-html 指令用于输出 html 代码:

用在标签中,而不是标签的值中

<div id="app">
    <div v-html="message"></div>
</div>

2、属性

HTML 属性中的值应使用 v-bind 指令

以下实例判断 use 的值,如果为 true 使用 class1 类的样式,否则不使用该类:

 <div v-bind:class="{'class1': use}">
    v-bind:class 指令
  </div>

3、表达式

Vue.js 都提供了完全的 JavaScript 表达式支持。

4、指令

指令是带有 v- 前缀的特殊属性。

指令用于在表达式的值改变时,将某些行为应用到 DOM 上。如下例子:

指令都是写在标签中,而不是作为标签的内容

5、参数

参数在指令后以冒号指明。例如, v-bind 指令被用来响应地更新 HTML 属性:

6、修饰符

修饰符是以半角句号 . 指明的特殊后缀,用于指出一个指令应该以特殊方式绑定

例如,.prevent 修饰符告诉 v-on 指令对于触发的事件调用event.preventDefault()

<form v-on:submit.prevent="onSubmit"></form>

7、用户输入

在 input 输入框中我们可以使用 v-model 指令来实现双向数据绑定:

v-model 指令用来在 input、select、textarea、checkbox、radio 等表单控件元素上创建双向数据绑定,根据表单上的值,自动更新绑定的元素的值。

按钮的事件我们可以使用 v-on 监听事件,并对用户的输入进行响应。

<body>
    <div id="app">
        <p>{{ message }}</p>
        <button v-on:click="reverseMessage">反转字符串</button>
    </div>
        
    <script>
    new Vue({
      el: '#app',
      data: {
        message: 'Runoob!'
      },
      methods: {
        reverseMessage: function () {
            console.log(this)
           // this是vue对象,其中包含vue对象的所有数据和方法 
          this.message = this.message.split('').reverse().join('')
        }
      }
    })
    </script>
    </body>
    </html>

8、过滤器

Vue.js 允许你自定义过滤器,被用作一些常见的文本格式化。由"管道符"指示, 格式如下:

<!-- 在两个大括号中 -->
{{ message | capitalize }}

<!-- 在 v-bind 指令中 -->
<div v-bind:id="rawId | formatId"></div>

过滤器函数接受表达式的值作为第一个参数。

过滤器可以串联:

{{ message | filterA | filterB }}

过滤器是 JavaScript 函数,因此可以接受参数:

{{ message | filterA('arg1', arg2) }}

这里,message 是第一个参数,字符串 ‘arg1’ 将传给过滤器作为第二个参数, arg2 表达式的值将被求值然后传给过滤器作为第三个参数。

9、缩写

v-bind 缩写

Vue.js 为两个最为常用的指令提供了特别的缩写:

<!-- 完整语法 -->
<a v-bind:href="url"></a>
<!-- 缩写 -->
<a :href="url"></a>

v-on 缩写

<!-- 完整语法 -->
<a v-on:click="doSomething"></a>
<!-- 缩写 -->
<a @click="doSomething"></a>
<!-- Handlebars 模板 -->
{{#if ok}}
  <h1>Yes</h1>
{{/if}}

10、条件语句

<!-- Handlebars 模板 -->
{{#if ok}}
  <h1>Yes</h1>
{{/if}}

v-if

v-else

v-else-if

v-else 、v-else-if 必须跟在 v-if 或者 v-else-if之后。

v-show

也可以使用 v-show 指令来根据条件展示元素:

  • 文本
  • html
  • 属性
  • 表达式

六、路由

路由嵌套很少到七层的;
在这里插入图片描述
在这里插入图片描述

多页面应用

单页面应用——体验更好

七、事件处理

Vue中的事件修饰符:【记住前三个】

1.prevent:阻止默认事件(常用);

2.stop:阻止事件冒泡(常用);

3.once:事件只触发一次(常用);

4.capture:使用事件的捕获模式;

5.self:只有event.target是当前操作的元素时才触发事件;

6.passive:事件的默认行为立即执行,无需等待事件回调执行完毕;

滚动

  • @scroll 滚动条触发,不是滚轮
  • @whell 鼠标滚轮触发,不是滚动条

键盘事件

1、Vue中常用的按键别名:

回车 => enter

删除 => delete (捕获“删除”和“退格”键)

退出 => esc

空格 => space

换行 => tab (特殊,必须配合keydown去使用)

上 => up

下 => down

左 => left

右 => right

2、Vue未提供别名的按键,可以使用按键原始的key值去绑定,但注意要转为kebab-case(短横线命名)

3、系统修饰键(用法特殊):ctrl、alt、shift、meta

(1).配合keyup使用:按下修饰键的同时,再按下其他键,随后释放其他键,事件才被触发。

(2).配合keydown使用:正常触发事件。

4、也可以使用keyCode去指定具体的按键(不推荐) 【编码不推荐】

5、Vue.config.keyCodes.自定义键名 = 键码,可以去定制按键别名
在这里插入图片描述

tab键可以改变焦点,失去对当前元素的焦点

八、计算属性

1、定义:要用的属性不存在,要通过已有属性计算得来。

2、原理:底层借助了Objcet.defineproperty方法提供的getter和setter。

3、get函数什么时候执行?

​ (1).初次读取时会执行一次。

​ (2).当依赖的数据发生改变时会被再次调用。

4、优势:与methods实现相比,内部有缓存机制(复用),效率更高,调试方便。

5、备注:

  1. 计算属性最终会出现在vm上,直接读取使用即可。

  2. 如果计算属性要被修改,那必须写set函数去响应修改,且set中要引起计算时依赖的数据发生改变。【真正进行改变】

data:是属性
computed:是计算属性

computed:{
		fullName:{
//get有什么作用?当有人读取fullName时,get就会被调用,且返回值就作为fullName的值
//get什么时候调用?1.初次读取fullName时。2.所依赖的数据发生变化时。
		get(){
		console.log('get被调用了')
		// console.log(this) //此处的this是vm
  		return this.firstName + '-' + this.lastName
					},
//set什么时候调用? 当fullName被修改时。
					set(value){
						console.log('set',value)
						const arr = value.split('-')
						this.firstName = arr[0]
						this.lastName = arr[1]
					}
				}

只读不改

//简写
fullName(){
		console.log('get被调用了')
		return this.firstName + '-' + this.lastName
}

九、监视属性

监视属性watch:

1.当被监视的属性变化时, 回调函数自动调用, 进行相关操作

2.监视的属性必须存在,才能进行监视!!

3.监视的两种写法:

(1).new Vue时传入watch配置

(2).通过vm.$watch监视

1、深度监视

(1).Vue中的watch默认不监测对象内部值的改变(一层)

(2).配置deep:true可以监测对象内部值改变(多层)。

备注:

(1).Vue自身可以监测对象内部值的改变,但Vue提供的watch默认不可以!

(2).使用watch时根据数据的具体结构,决定是否采用深度监视。

computed和watch之间的区别:

  1. computed能完成的功能,watch都可以完成。

  2. watch能完成的功能,computed不一定能完成,例如:watch可以进行异步操作。

 // 已经明确监视对象
watch:{
	isHot:{
		immediate:true, //初始化时让handler调用一下
		//handler什么时候调用?当isHot发生改变时。
		handler(newValue,oldValue){
		console.log('isHot被修改了',newValue,oldValue)
					}
				}
} 
// 创建vue对象时不知道监视对象
vm.$watch('isHot',{
	immediate:true, //初始化时让handler调用一下
	//handler什么时候调用?当isHot发生改变时。
	handler(newValue,oldValue){
	console.log('isHot被修改了',newValue,oldValue)
}
//监视多级结构中所有属性的变化
				numbers:{
					deep:true,
					handler(){
					console.log('numbers改变了')
					}
				}
watch:{
	isHot:{
	// immediate:true, //初始化时让handler调用一下
	// deep:true,//深度监视
		handler(newValue,oldValue){
		console.log('isHot被修改了',newValue,oldValue)}
			}, 
//简写
	isHot(newValue,oldValue){
		console.log('isHot被修改了',newValue,oldValue,this)} 
//正常写法
vm.$watch('isHot',{
	immediate:true, //初始化时让handler调用一下
	deep:true,//深度监视
	handler(newValue,oldValue){
	console.log('isHot被修改了',newValue,oldValue)
			}
		}) 

//简写
vm.$watch('isHot',(newValue,oldValue)=>{
	console.log('isHot被修改了',newValue,oldValue,this)
		}) 

2、computed和watch之间的区别

  1. computed能完成的功能,watch都可以完成。 【计算属性更加简单】

  2. watch能完成的功能,computed不一定能完成,例如:watch可以进行异步操作。

3、两个重要的小原则

  1. 所被Vue管理的函数,最好写成普通函数,这样this的指向才是vm 或 组件实例对象。

  2. 所有不被Vue所管理的函数(定时器的回调函数、ajax的回调函数等、Promise的回调函数),最好写成箭头函数,

​ 这样this的指向才是vm 或 组件实例对象。

watch:{
	firstName(val){
// 定时器,不是vue不是管理的,而是系统管理的
		setTimeout(()=>{
			console.log(this)
			this.fullName = val + '-' + this.lastName
					},1000);
				},
	lastName(val){
		this.fullName = this.firstName + '-' + val}

十、绑定样式

【vue管理动态内容】

1、class样式

写法:class="xxx" xxx可以是字符串、对象、数组。

字符串写法:

  • 适用于:类名不确定,要动态获取。
  • 适用于:样式的类名不确定,需要动态指定

对象写法:

  • 适用于:要绑定多个样式,个数不确定,名字也不确定。
  • 适用于:要绑定的样式个数确定、名字也确定,但要动态决定用不用

数组写法:

  • 适用于:要绑定的样式个数不确定、名字也不确定
  • 适用于:要绑定多个样式,个数确定,名字也确定,但不确定用不用。

2、style样式

对象写法

  • :style="{==fontSize==: xxx}"
  • 其中xxx是动态值。【其中的key不能乱写,要写style中的样式对象】

数组写法

  • :style="[a,b]"
  • 其中a、b是样式对象。

整理不易,关注和收藏后拿走!欢迎留言~
欢迎专注我的公众号:AdaCoding 和 Github:AdaCoding123
在这里插入图片描述

  • 31
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值