vue3文档学习
1.vue的核心功能
1.声明式渲染
2.响应性: vue会自动跟踪JavaScript状态并在其发生变化时响应式的更新DOM。
2.渐进式框架
根据不同的需求场景,可以用不同的方式使用vue:
1.无需构建步骤,渐进式增强静态的HTML;
2.在任何页面中作为 Web Components 嵌入;
3.单页应用 (SPA);
4.全栈 / 服务端渲染 (SSR);
5.Jamstack / 静态站点生成 (SSG);
6.开发桌面端、移动端、WebGL,甚至是命令行终端中的界面
3.SFC(single-file-components) - 单文件组件
即:
<template></template>
<script></script>
<style scoped></style>
4.API风格
即: 选项式API和组合式API。
选项式API:
使用选项式 API,我们可以用包含多个选项的对象来描述组件的逻辑,例如data
、methods
和mounted
。选项所定义的属性都会暴露在函数内部的this
上,它会指向当前的组件实例。
组合式API:
通过组合式 API,我们可以使用导入的 API 函数来描述组件逻辑。在单文件组件中,组合式 API 通常会与<script setup>
搭配使用。这个setup
attribute 是一个标识,
告诉 Vue 需要在编译时进行一些处理,让我们可以更简洁地使用组合式 API。比如,<script setup>
中的导入和顶层变量/函数都能够在模板中直接使用。
5.安装流程
前提: nodejs最新版本
然后执行: npm init vue@latest =>这个命令是安装并执行 create-vue;
...
安装依赖: npm install
运行: npm run dev
6.创建一个应用
每个 Vue 应用都是通过createApp
函数创建一个新的 应用实例:
import { createApp } from 'vue'
// 从一个单文件组件中导入根组件
import App from './App.vue'
const app = createApp({
/* 根组件选项 */
App
})
app.mount('#app');
App.vue页面:
<div id="app"></div>
挂载应用:
应用实例必须在调用了.mount()
方法后才会渲染出来。该方法接收一个“容器”参数,可以是一个实际的 DOM 元素或是一个 CSS 选择器字符串。
7.模板语法
文本插值:
最基本的数据绑定形式是文本插值,它使用的是“Mustache”语法 (即双大括号):
<span>{{message}}</span>
原始HTML:
双大括号会将数据解释为纯文本,而不是 HTML。若想插入 HTML,你需要使用v-html
指令:
<span v-html="rawHtml"></span>
Attribute绑定:
双大括号不能在 HTML attributes 中使用。想要响应式地绑定一个 attribute,应该使用v-bind
指令:
<span v-bind:id="id"></span>
<span :id="id"></span>
动态绑定多个值:
const objAttributes = {
id: 'container',
class: 'hello'
}
通过不带参数的v-bind
,你可以将它们绑定到单个元素上:
<div v-bind="objAttributes"></div>
使用JavaScript表达式:
在 Vue 模板内,JavaScript 表达式可以被使用在如下场景上:
1.在文本插值中 (双大括号)
2.在任何 Vue 指令 (以v-
开头的特殊 attribute) attribute 的值中
8.响应式基础
声明响应式状态:
使用reactive()
函数创建一个响应式对象或数组:
import { reactive } from 'vue'
const state = reactive({ count: 0 })
DOM更新时机:
当你更改响应式状态后,DOM 会自动更新。然而,你得注意 DOM 的更新并不是同步的。相反,Vue 将缓冲它们直到更新周期的 “下个时机” 以确保无论你进行了多少次状态更改,每个组件都只需要更新一次。
若要等待一个状态改变后的 DOM 更新完成,你可以使用 nextTick() 这个全局 API:
import { nextTick } from 'vue'
function increment() {
state.count++
nextTick(() => {
// 访问更新后的 DOM
})
}
深层响应式:
在 Vue 中,状态都是默认深层响应式的。这意味着即使在更改深层次的对象或数组,你的改动也能被检测到。
值得注意的是,reactive()
返回的是一个原始对象的 Proxy,它和原始对象是不相等的:
const raw = {}
const proxy = reactive(raw)
// 代理对象和原始对象不是全等的
console.log(proxy === raw) // false
9.自定义事件配合v-model使用
<input v-model="searchText" />
等价于(编译器会对 v-model进行展开)
<input :value="searchText" @input="searchText = $event.target.value" />
而当使用在一个组件上时,v-model会被展开为如下的形式:
<CustomInput
:modelValue="searchText"
@update:modelValue="newValue => searchText = newValue"
/>
在刚刚这个例子中,<CustomInput>组件内部需要做两件事:
1.将内部原生input元素的value attribute绑定到 modelValue prop.
2.输入新的值时在 input 元素上触发 update:modelValue 事件。
CustomInput.vue:
<script setup>
defineProps(['modelValue']);
defineEmits(['update:modelValue'])
</script>
<template>
<input
:value="modelValue"
@input="$emit('update:modelValue', $event.target.value)"
/>
</template>
10.依赖注入
prop 逐级透传问题
背景:当从父组件向子组件传递数据时,会用到props,有一些多层级嵌套的组件,形成了一颗巨大的组件树,而某个
深层的子组件需要一个较远的祖先组件中的部分数据。在这种情况下,如果仅用props则必须将其沿着组件链逐级传递
下去,这样非常麻烦。
provide 和 inject 可以解决这一问题。一个父组件相对于其所有的后代组件,会作为依赖提供者。任何后代的组件
树,无论层级有多深,都可以注入由父组件提供给整条链路的依赖。
<script setup> // provide提供
import {provide} from 'vue';
provide('message', 'hello');// 第一个参数是 注入名,第二个参数是 值。
</script>
<script seup>// inject注入
import {inject} from 'vue'
const message = inject('message');
</script>
11.异步组件
defineAsyncComponent
背景描述: 在大型项目中,需要拆分应用为更小的块,并仅在需要时再从服务器加载相关组件。
import { defineAsyncComponent } from 'vue';
const AsyncComp = defineAsyncComponent(()=>{
return new Promise((resolve, reject)=>{
//...从服务器获取组件
resolve(/*获取到的组件*/)
})
OR //或者直接导入vue单文件组件
import('./components/AdminPageComponent.vue')
})
// ...像使用其他一般组件一样使用 AsyncComp
12.自定义组件
例如:
<script setup>
//在模板中启用 v-focus
const vFocus = {
mounted:(el)=>el.focus()
}
</script>
<template>
<input v-focus />
</template>
指令钩子: 一个指令的定义对象可以提供几种钩子函数
const myDirective = {
//在绑定元素的 attribute前
//或事件监听器应用前调用
created(el, binding, vnode, prevVnode){
el: 指令绑定到的元素。可以用于直接操作DOM。
binding:一个对象,包含 value,oldValue等属性。
vnode:代表绑定元素的底层VNode。
prevNode:之前的渲染中代表指令所绑定元素的VNode。
},
//在元素被插入到DOM钱调用
beforeMount(el, binding, vnode, prevVnode){},
//在绑定元素的父组件及他自己的所有子节点都挂载完成后调用
mounted(el, binding, vnode, prevVnode){},
//绑定元素的父组件更新前调用
beforeUpdate(el, binding,vnode,prevVnode){},
//在绑定元素的父组件及他自己的所有子节点都更新后调用
updated(el,binding,vnode,prevVnode){},
//绑定元素的父组件卸载前调用
beforeUnmount(el, binding, vnode, prevVnode){},
//绑定元素的父组件卸载后调用
unmounted(el,binding,vnode,prevVnode){}
}
例子:
<div v-color="color"></div>
app.directive('color',(el,binding)=>{
el.style.color = binding.color;
})
13.KeepAlive
<component>元素来实现动态组件的用法:
// 非活跃的组件将会被缓存
<KeepAlive>
<component is="activeComponent" />
</KeepAlive>
<KeepAlive>默认会缓存内部的所有组件实例,也可以通过 include和 exclude
prop 来定制该行为。
例如:
include='a,b' OR :include='/a|b/' OR :include="['a','b']" 会根据组件的name选项进行匹配。
:max="10" 最大缓存实例数
缓存实例的生命周期:
onActivated()和 onDeactivated()注册相应的两个状态的生命周期钩子
import { onActivated, onDeactivated } from 'vue';
onActivated(()=>{
//调用时机为首次挂载以及每次从缓存中被重新插入时
})
onDeactivated(()=>{
//在从DOM上移除,进入缓存以及组件卸载时调用
})
14.Teleport
<Teleport>是一个内置组件,可以将一个组件内部的一部分模板 传送 到该组件的DOM结构外层的位置去。
15.路由
服务端路由指的是 服务器根据用户访问的URL路径返回不同的响应结果。
在单页面应用中,客户端的JavaScript可以拦截页面的跳转请求,动态获取新的数据,无需重新加载就可更新当前页面。
一个客户端路由器利用 History API 或是 hashchange 事件这样的浏览器API来管理应用当前应该渲染的视图。
vue默认路由模式是 hash 模式,hash模式背后的原理是 onhashchange事件,可以在window对象上监听这个事件。
hash发生变化的URL都会被浏览器记录下来。hashchange只能改变#后面的url片段。
在hash模式下,前端路由修改的是#中的信息,而浏览器请求时不带它玩,所以刷新的话不存在问题。
history路由:
切换历史状态:back();//后退 forward();//前进 go(2);//前进两次
修改历史状态: pushState, replaceState;接收三个参数: stateObj, title, url
通过pushstate把页面的状态保存在state对象中,当页面的url再变回这个url时,可以通过event.state
取到这个state对象,从而可以对页面状态进行还原。
无#标识。
不能刷新,因为刷新是去请求服务器。如果服务器中没有相应的响应或者资源,会报404.
16.状态管理
组成部分:状态,视图,交互。
Pinia用法
创建一个store:
// stores/counter.js
import{ defineStore } from 'pinia';
export const useCounterStore = defineStore('counter',{
state: ()=>{
return { count: 0, todos: [] }
},// 也可这样定义 state:()=>({ count: 0 })
actions: {
increment(){ this.count++ },
addTodo(text){
this.todos.push({ text, id:this.nextId++, isFinished:false })
}
},
getters: {
finishedTodos(state){
return state.todos.filter((todo)=>todo.isFinished)
}
}
})
//然后在一个组件使用这个store
<script setup>
import { useCounterStore } from '@/stores/counter'
export default {
const counter = useCounterStore();
counter.count++;
counter.$patch({ count: counter.count +1 })
//或者使用action替代
counter.increment();
}
</script>
pinia优点:
1.mutation已弃用;
2.无需动态添加Store
3.不再有可命名的模块
4.不再有嵌套结构的模块
vue3文档学习的更多相关文章
- EasyUI文档学习心得
概述 jQuery EasyUI 是一组基于jQuery 的UI 插件集合,它可以让开发者在几乎完全不需要CSS以及复杂的JS代码情况下完成美观且功能强大的Web界面. 本文主要说明一些如何利用Eas ...
- Spring文档学习
Spring文档学习 参考Spring Framework Documentation学习 1. IoC 容器 1.1 容器实例化 <beans> <import resource= ...
- Cassandra1.2文档学习解读计划——为自己鼓劲
最近想深入研究一下Cassandra,而Cassandra没有中文文档,仅有的一些参考书都是0.7/0.6版本的.因此有个计划,一边学习文档(地址:http://www.datastax.com/do ...
- 《MATLAB从入门到放弃》二维曲线和图形绘制基础(二):使用Help文档学习line、plot、plotyy、subplot、hold绘图函数
目录: » plot 最常用的二维曲线绘图函数 > 帮助文档 > 基本使用语法 > 线条的样式.符号和颜色调整 > 图形属性调整 > 使用图形句柄进行设置 » ...
- 这可能是最详细的 iOS 学习入门指南(含书目/文档/学习资料)
1 零基础小白如何进行 iOS 系统学习 首先,学习目标要明确: 其次,有了目标,要培养兴趣,经常给自己一些正面的反馈,比如对自己的进步进行鼓励,在前期小步快走: 再次,学技术最重要的一点就是多动手. ...
- 通过程序校验xml文档学习笔记
校验xml文档,可以通过程序来校验,利用一段js代码即可. 各行代码的含义已经写出,运行这个html文件,检验如下xml代码: 结果如下: 如果xml文档出现错误: 结果如下: 其中,obj.asyn ...
- Nodejs v4.x.0API文档学习(2)Assert断言测试模块
文档参考地址:https://nodejs.org/dist/latest-v4.x/docs/api/ Assert(断言) assert模块提供了一组简单的断言测试方法,可以拥有测试不变量.该模块 ...
- Nodejs v4.x.0API文档学习(1)简介
文档参考地址:https://nodejs.org/dist/latest-v4.x/docs/api/ 简介 下面是用nodejs编写的一个web服务的例子,返回"Hello World& ...
- linux 内存-文档学习
ptmalloc http://www.malloc.de/en/ tcmalloc https://github.com/gperftools/gperftools jcmalloc http:// ...
- <文档学习>AirSim/using_car.md Choosing Your Vehicle: Car or Multirotor
如何在AirSim中使用汽车 默认情况下,AirSim中使用的车型为多转子multirotor. 如果你想使用汽车,那么只需在你的settings.json(https://github.com/Mi ...
随机推荐
- 零基础解读ChatGPT:对人类未来工作是威胁还是帮助?
摘要:火到现在的ChatGPT到底是什么?它背后有哪些技术?对于我们的工作和生活会有啥影响?快来一起了解吧~ 本文分享自华为云社区<零基础解读ChatGPT:对人类未来工作是威胁还是帮助?> ...
- dotnet总结
初衷: 搞了几年.Net ,一直没在博客园做过系统的总结,并打算按照下面的结构来写 语言层面 类型系统 [查看]: https://www.cnblogs.com/francisXu/p/136027 ...
- nvm作用、下载、使用、常见问题
一.nvm是什么及作用 nvm全名node.js version management,同等于nodejs的版本管理工具.当不同项目使用不同版本nodejs且不统一时,这时就用到nvm进行不同项目不同 ...
- 01#Vue Transition 过渡:基于 CSS 过渡
过渡的阶段 上图是过渡的 6 个阶段示意图.总体是进入和离开两个阶段,进入和离开又各自有两个阶段.下表格是对每一个阶段的解释: 进入和离开实现过渡效果使用的是 CSS 样式,过度的样式相当于重写覆盖了 ...
- MogDB 学习笔记之 -- 索引失效
[[toc]]# 概念描述哪些操作会导致分区表的全局索引失效(比如 move partition,drop partition ,truncate partition ,split partition ...
- 若依-更换数据库-sqlite
基础 我是在ruoyi-vue已经安装了mybatis-plus的基础上进行的修改 关于SQLite SQLite 是一个软件库,实现了自给自足的.无服务器的.零配置的.事务性的 SQL 数据库引擎. ...
- 【2】APP自动化-脚本研发2.0-3.0需要重复看视频
calculatorV1.0.py #V1.0 实现手机端计算器自动化测试:使用常量进行参数传递#导入appium类库from appium.webdriver.webdriver import W ...
- C++容器map、unordered_map、set、unordered_set的区别
1.map: 底层由红黑树实现. Key在红黑树中有序排列,对红黑树进行中序遍历即可得到Key从小到大的排序序列. 使用map可在O(1)的时间复杂度下快速查找到Key. 2.unordered_ma ...
- VUE学习-列表渲染
列表渲染 v-for <!-- v-for="(v,k,i) in arr/obj" --> <ul id="app"> <li ...
- 代码随想录 day0 博客怎么写
前言 2.25日开始记录自己的博客生涯以及代码随想录训练营的每日内容 一.题目链接怎么找?怎么设置连接? 力扣题目链接1:力扣 二.正文怎么写? 二分查找 算法思路: 二分查找需要保证数组为有序数组同 ...