Vue3学习笔记

组件基础:

类型:

根组件:

定义:

const RootComponent = { /* 选项 */ }

使用:

创建Vue应用对象:const app = Vue.createApp(RootComponent)

挂载到DOM元素中:const vm = app.mount('#app')

全局:

注册:

app.component('my-component-name',

               {{ data() {  return {  count: 0   }  },                           

                 template: ` <button @click="count++"> 点了 {{ count }} 次! </button>` }})

使用:

<my-component-name></my-component-name>

复用:任意次数

使用范围:app 实例模板;

                  根实例组件树中的所有子组件的模板

局部:

定义:

创建js对象:

const ComponentA = {   /* ... */ }

const ComponentB = {  /* ... */ }

注册组件到实例:

components: {

    'component-a': ComponentA,

    'component-b': ComponentB

  }

使用:

<my-component-name></my-component-name>

复用:任意次数

使用范围:

注册局部组件的实例 

Prop(数据传递):

定义:

子组件(显式声明prop)接受父组件(props)传递的数据的一个属性

动态:

用 v-bind 动态绑定 props 的值到父组件的数据中,父组件数据变化,会传导给子组件

验证:

可以指定prop验证要求; 验证失败产生一个控制台的警告(开发环境)

           type:(可多个可能的类型)

                   原生构造器: String、Number、Boolean、Array、Object、Date、Function、Symbol

                   自定义构造器: instanceof 检测。

          default: 默认值

单文件组件(SFC)

定义:

*.vue 文件

一个 Vue 组件的模板、逻辑JavaScript 与样式 CSS封装在单个文件中。

操作步骤:

main.js文件:创建一个简单的项目

import { createApp } from 'vue'

import App from './App.vue' 

createApp(App).mount('#app')

App.vue:定义一个简单组件

<template> //声明元素 </template>

<script> //数据与事件处理逻辑

//将组件定义导出为一个默认的对象( Vue3)

export default {  data() {  return {  message: 'Hello, RUNOOB!'  }  } }

</script>

<style> //声明css样式 </style>

 ./src/components/ 目录下创建子组件文件,*.vue 文件

<template></template>

<script> </script>

 <style></style>

./src/main.js 文件,引入并定义子组件

import HelloRunoob from './components/HelloRunoob.vue'

App.vue在父组件的模板中,使用自定义标签的方式引入子组件   

<hello-runoob></hello-runoob>

组合式 API

setup() 函数:

时间:

组件创建 ,created() 之前执行。

参数:

第一个参数 props:响应式 。

第二个参数 contex:setup 中有用的值。

ref 函数:

生成任何响应式变量

在任何地方起作用

访问.value 属性

生命周期钩子

setup() 函数中,实现带有 on 前缀的钩子函数 

onBeforeMount:组件实例挂载之前

onMounted:组件实例挂载之后 

onBeforeUpdate:组件实例即将更新

onUpdated:组件实例更新完毕

onBeforeUnmount:组件实例即将销毁

onUnmounted:组件实例销毁完毕

模板引用

获得对模板内元素或组件实例,引用变量或方法

声明 ref ;从 setup() 返回。

v-for 中用法

模板引用没有特殊处理;引用函数执行自定义处理。

侦听 

watch() 和 watchEffect() :

DOM 挂载或更新之前运行副作用;引用空元素。

添加flush: 'post' 选项:

DOM 更新后运行副作用;引用正确的元素。

标准指令

HTML 模板中以 v- 开头的特殊属性形式,

作用:

将响应式数据绑定到 DOM 元素上

在 DOM 元素上进行一些操作。

优点:

相比JavaScript,创建响应式页面要容易,代码更少。

常用的 Vue 指令:

指令                                   描述

v-bind           用于将 Vue 实例的数据绑定到 HTML 元素的属性上。

v-if               用于根据表达式的值来条件性地渲染元素或组件。

v-show           用于根据表达式的值来条件性地显示或隐藏元素。

v-for           用于根据数组或对象的属性值来循环渲染元素或组件。

v-on           用于在 HTML 元素上绑定事件监听器,使其能够触发 Vue 实例中的方法或函数。

v-model           用于在表单控件和 Vue 实例的数据之间创建双向数据绑定。

自定义指令

语法:

全局指令

全局实例对象名称.directive('指令名称', {

  // 指令逻辑

})

局部指令

const 实例名称 = { 

   directives: { 指令名称: {  // 指令逻辑   } }

}

钩子

钩子函数 

created :       在指令绑定元素的属性或事件监听器被应用之前调用

beforeMount :  指令第一次绑定到元素并且在挂载父组件之前调用

mounted :      在绑定元素的父组件被挂载后调用

beforeUpdate:  在更新包含组件的 VNode 前调用

updated:       在更新包含组件的 VNode 及其子组件的 VNode后调用。

beforeUnmount: 绑定指令的元素父组件,卸载之前调用,只调用一次。

unmounted:     当指令与元素解除绑定,且父组件已卸载时调用,只调用一次。

钩子函数参数

el

指令绑定到的元素。

可用于直接操作 DOM。

binding

一个对象

属性:

instance:使用指令的组件实例。

value:   传递给指令的值

oldValue:先前的值,仅在 beforeUpdate 和 updated 中可用。值是否已更改都可用。

arg:     参数传递给指令 (如果有)。

modifiers:包含修饰符 (如果有) 的对象。

dir:      一个对象,在注册指令时作为指令内容参数传递 

vnode 

el 参数收到的真实 DOM 元素的蓝图。

prevNode 

上一个虚拟节点,仅在 beforeUpdate 和 updated 钩子中可用。

模板语法

插值

文本

语法:

 {{...}}(双大括号);内容为对应组件实例属性的值,

特点:

改变属性的值,{{...}} 标签内容也会更新 

使用 v-once 指令,执行一次性地插值

Html

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

属性

使用 v-bind 指令。 

特点:

布尔属性,常规值为 true 或 false,

属性值为 null 或 undefined,则该属性不会显示出来。 

表达式

在当前活动实例的数据作用域下,作为 JavaScript 被解析。

特点:

每个绑定都只能包含单个表达式

指令

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

在表达式的值改变时,将某些行为应用到 DOM 上。

参数

在指令后以冒号指明。

v-bind 指令:响应地更新 HTML 属性:

v-on 指令:监听 DOM 事件

修饰符

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

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

输入

使用 v-model 指令,来实现双向数据绑定

input、select、textarea、checkbox、radio 等表单控件元素

缩写

v-bind 缩写   

<a :href="url"></a>

v-on 缩写 

<a @click="doSomething"></a>

条件语句

v-if

条件判断,表达式返回 true 时显示元素或模版:

v-else-if

即 v-if 的 else-if 块,可链式使用多次:

v-else

给 v-if 添加一个 "else" 块:

v-show

根据条件展示元素:

循环语句

site in sites

sites 是源数据数组

site 是数组元素迭代的别名。

绑定数据到数组来:

一个可选的第二个参数,参数值为当前项的索引:

迭代对象

一个对象的属性来迭代数据:

第二个的参数为键名:

迭代整数

循环整数

显示过滤/排序后的结果

数组的元素进行处理,后再显示出来;

创建一个计算属性,来返回过滤或排序后的数组。

v-for/v-if 联合使用

select 设置默认值:

组件使用

元素上一样使用:

任何数据都不会被自动传递到组件里

把迭代数据传递到组件里使用props

计算属性

关键词: computed

作用:

声明计算属性。

提供的函数将用作属性的 getter

特点:

属性默认只有 getter,可以直接跟在属性名称后 ;

可以自定义一个 setter,在属性被赋值时会被调用;

在计算属性依赖发生改变时,计算属性也会更新。

联系与区别:

computed 是基于依赖缓存,只有依赖发生改变时才会重新取值。

methods在重新渲染的时候,函数总会重新调用执行

监听属性

关键字:watch

语法:

1、实例对象已经创建:

实例对象.$watch('属性名称', function(nval, oval) {

    //属性变化时,执行逻辑;

});

2、实例对象创建时:

const 实例对象名称 = {

  data() {

    return {

      属性名称:属性初始值

    }

  },

  watch : {

    属性名称:function(newValue, oldValue) {

      //属性变化时,执行逻辑;

    }

  }

}

作用:

监测响应式属性的变化;

改变时,执行自定义的逻辑,

优点:

更多的控制权和灵活性

异步加载

数据赋新值,自动调用监听函数的逻辑。

样式绑定

v-bind设置样式属性(class 和 style)

表达式:字符串、对象、数组、三元表达式

class 属性

语法:

<div :class="{ '样式名称1': 布尔属性1,'样式名称2': 布尔属性2}"></div>

<div :class="{对象名称}"></div>

<div :class="{ [样式名称1, 样式名称2]}"></div> 

<div :class="{[布尔属性? 样式名称1: 样式名称2, 样式名称3]}"></div>

特点:

多属性,动态切换多个 class

与普通的 class 属性共存

三元表达式来切换列表中的 class

style(内联样式)

语法:

<div :style="{样式属性名称1: 实例属性1, 样式属性名称2: 实例属性2 + 'px' }"></div>

<div :style="对象名称"></div>

<div :style="[样式属性名称1, 样式属性名称2]">菜鸟教程</div>

<div :style="{ 样式属性名称: [实例属性1, 实例属性2, 实例属性3] }"></div>

注:

渲染数组中最后一个被浏览器支持的值

组件使用 class 属性:

模版里添加:

添加class;已有 class 不会被覆盖

数据绑定 class

单根元素:作用根元素

多个根元素:$attrs 组件属性,决定接收类的元素。

:class="$attrs.class"

事件处理

v-on 指令监听 DOM 事件,从而执行 JavaScript 代码。

缩写为 @ 符号

语法格式:

v-on:click="methodName"

@click="methodName"

使用:

调用 JavaScript 方法

内联 JavaScript 语句

特点:

可以有多个方法,由逗号运算符分隔

修饰符:

可以串联

事件:

处理 DOM 事件细节:

.stop - 阻止冒泡

.prevent - 阻止默认事件

.capture - 阻止捕获

.self - 只监听触发该元素的事件

.once - 只触发一次

.left - 左键事件

.right - 右键事件

.middle - 中间滚轮事件

按键:

v-on:keyup.按键编码

v-on:keyup.按键别名

全部的按键别名:

.enter

.tab

.delete (捕获 "删除" 和 "退格" 键)

.esc

.space

.up

.down

.left

.right

系统修饰键:

.ctrl

.alt

.shift

.meta

鼠标按钮:

.left

.right

.middle

.exact :

有且只有精确的系统修饰符组合或单个键被按下的时候才触发

表单

v-model 会根据控件类型,自动选取正确的方法来更新元素。

v-model 会忽略所有表单元素的属性初始值,使用data 选项中声明初始值。

v-model使用属性和事件类型:

表单元素                  属性        事件

text 、 textarea           value        input

checkbox 、 radio       checked     change

select                    value       change

值绑定

值类型:

复选框:只选一个为逻辑值,多个则绑定到同一个数组

单选按钮:一个字符串

select 列表:单选一个对象,多个则绑定到同一个数组

联系:

v-model:

绑定值,通常是静态字符串 (对于复选框也可以是布尔值):

v-bind:

绑定值,绑到动态属性上;可以是非字符串。

修饰符

.lazy

不在input 事件中同步输入框的值与数据;在 change 事件中同步:

语法:

<input v-model.lazy="对象名称" >

.number

输入值自动转为 Number 类型(如果原值的转换结果为 NaN 则返回原值),

语法:

<input v-model.number="对象名称" type="number">

.trim

自动过滤用户输入的首尾空格

语法:

<input v-model.trim="对象名称">

路由

通过不同的 URL 访问不同的内容。

多视图的单页 Web 应用(SPA)。

Vue Router 不重新加载页面的情况下,更改并处理 URL 的生成以及编码。 

安装 

1、直接下载 / CDN https://unpkg.com/vue-router@4

2、NPM

淘宝镜像(推荐):

npm install -g cnpm --registry=https://registry.npmmirror.com

cnpm install vue-router@4

 

router-link

一个组件,设置一个导航链接,切换不同 HTML 内容。 

router-view

显示与 url 对应的组件。放在任何地方,适应布局。

设置步骤:

// 1. 定义路由组件.

// 也可以从其他文件导入

const Home = { template: '<div>Home</div>' }

const About = { template: '<div>About</div>' }

// 2. 定义一些路由

// 每个路由都需要映射到一个组件。 

const routes = [

  { path: '/', component: Home },

  { path: '/about', component: About },

]

// 3. 创建路由实例并传递 `routes` 配置 

const router = VueRouter.createRouter({

  // 4. 内部提供了 history 模式的实现。为了简单起见,我们在这里使用 hash 模式。

  history:’history ’,

  routes, // `routes: routes` 的缩写

})

// 5. 创建并挂载根实例

const app = Vue.createApp({})

//确保 _use_ 路由实例使整个应用支持路由。

app.use(router)

app.mount('#app')

// 现在,应用已经启动了!

<router-link> 相关属性 

to

表示目标路由的链接。

一个字符串或者是描述目标位置的对象。

replace

点击时调用,导航后不会留下 history 记录。

append

在当前 (相对) 路径前添加其路径

tag

渲染成某种标签,会监听点击,触发导航。

active-class

设置链接激活时使用的 CSS 类名 

exact-active-class

配置当链接被精确匹配的时候应该激活的 class 

event

声明可以用来触发导航的事件。可以是一个字符串或是一个包含字符串的数组。

混入

定义:

定义了一部分可复用的方法或者计算属性。

联系:

混入对象,可以包含任意组件选项。

组件,使用混入对象时,所有混入对象的选项将被混入该组件本身的选项。

语法:

局部:

// 定义混入对象

const 混入对象名称= {

  data() { //混入对象属性},

  methods: { 混入对象方法名称1() { //混入对象方法逻辑}  }

// 定义一个应用,使用混入

const app = Vue.createApp({

  mixins: [混入对象名称]

})

 // 挂载元素

app.mount('#app')

全局

影响之后创建的所有 Vue 实例

//创建vue应用实例

const app = Vue.createApp({

  自定义对象名称:自定义对象值

})

// 全局混入钩子函数,绑定自定义对象的处理。

app.mixin({created() {  //处理自定义对象逻辑  } })

// 挂载元素

app.mount('#app')

选项合并

当组件和混入对象含有同名选项时,这些选项将以恰当的方式混合。

数据:

只赋值一个,组件优先。

钩子:

都将被调用;mixin优先。

对象:

合并为同一个对象。两个对象键名冲突时,取组件对象的键值对

Ajax(axios)

待续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值