| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> JavaScript知识库 -> Vue3 学习笔记--深入组件 -> 正文阅读 |
|
[JavaScript知识库]Vue3 学习笔记--深入组件 |
1、组件注册1.1 全局注册
或者像下面这样写
1.2 局部注册通过一个普通的 JavaScript 对象来定义组件
然后在 components?选项中定义你想要使用的组件:
局部注册的组件在其子组件中不可用 例如,上面的组件 ComponentA 和 ComponentB 都是在 app 中局部注册的 但在 ComponentB 中是无法使用 ComponentA?的 除非你这样写:
在 ComponentB 中注册?ComponentA 之后,才能使用?ComponentA 2、父子组件通信父子组件通过两种不同的方式来相互通信
先来讲一下父传子,也就是 props 2.1 PropsProp 是你可以在组件上注册的一些自定义 attribute Props 有两种常见的用法:
直接用代码来解释用法
在上述代码中,我们局部注册了一个组件 blog-post 并且在 props 中自定义了一个 attribute,并且在 template 中使用了 title
在父组件中使用?blog-post 组件,并且给 title 赋值 这样就实现了父组件给子组件传值 页面效果如下: 2.1.1 Props 的数组用法?
2.1.2 Props 的对象用法type 的类型可以是下面这些: 补充:对象类型的其它写法
注意:使用 DOM 中的模板时,驼峰命名的 prop 名需要使用其等价的短横线分隔符命名来替换 2.2?非 Prop 的 Attribute一个非 prop 的 attribute 是指传向一个组件 但是该组件并没有相应 props 或 emits 定义的 attribute 2.2.1 Attribute 继承2.2.2 禁用 Attribute 继承如果我们不希望根元素继承 attribute 可以在组件的选项中设置 inheritAttrs: false 如下所示: 2.2.3 多个根节点上的 Attribute 继承2.3?监听子组件事件首先,我们需要?在子组件中定义好某些情况下触发的事件名称 其次,在父组件中以 v-on 的方式传入要监听的事件名称,并绑定对应的方法 最后,在子组件中发生某个事件的时候,根据事件名触发对应的事件 先看一个计数器的例子,如下图所示: 大致过程就是: 2.3.1 验证抛出的事件
3、非父子组件通信使用 provide 和 inject 无论组件层次结构有多深,父组件都可以作为其所有子组件的依赖提供者 这个特性有两个部分:
还是继续用前面那个例子进行讲解 provide 组件实例的 property 但如果 todos 中的内容发生了变化,也就是 todos.length 改变时,不会反映在 inject 中 3.1 处理响应性全局事件总库 mitt 库 ? 4、插槽4.1 基本使用4.2 默认内容使用插槽时,如果没有提供内容,则会显示插槽默认的内容 如果我们提供内容,则这个提供的内容将会被渲染从而取代默认内容 4.3 具名插槽4.3.1 具名插槽的缩写v-slot: 可以写成 # 因此上面的代码可以这样写:
4.4 动态插槽名
4.5?渲染作用域规则只有一条: 父级模板里的所有内容都是在父级作用域中编译的 子模板里的所有内容都是在子作用域中编译的? 4.6 作用域插槽有时让插槽内容能够访问子组件中才有的数据是很有用的 下面我们来看一个例子,组件 todo-list 中包含一个 items 我们将其动态的绑定到了 slot 上面
我们在父组件中使用了 todo-list 组件,要想在父组件中使用 slot 中绑定的 attribute 我们需要先包裹一层 template,然后把之前绑定的 attribute 传过来 也就是给 v-slot 赋一个 slotProps?(绑定在 slot 元素上的 attribute 被称为 插槽 prop) 最后通过 slotProps 获取传过来的值
4.6.1 独占默认插槽的缩写语法?在上述情况下,当被提供的内容只有默认插槽时,组件的标签才可以被当作插槽的模板来使用
这种写法还可以更简单 当我们的插槽是默认插槽时,也就是说它没有名字,那就可以像这样写:
默认插槽的缩写语法不能和具名插槽混用 只要出现多个插槽,请始终为所有的插槽使用完整的基于 <template> 的语法:
5、动态组件上述内容可以通过 Vue 的 <component> 元素加一个特殊的 is Attribute 来实现:
注:也可以对动态组件传值和监听事件 5.1 keep-live当在组件之间切换的时候,你有时会想保持这些组件的状态,以避免反复渲染导致的性能问题 用法如下:
keep-live 的属性:
注:对于已经被缓存的组件来说,再次切换回该组件时 ? ? ? ?我们是不会执行 created 或者 mounted 等生命周期函数 ? ? ? ?但是可以使用 activated 和 deactivated 这两个生命周期钩子函数来监听?? 5.2 Webpack 的代码分包默认情况下,在构建整个组件树的过程中,因为组件和组件之间是通过模块化直接依赖的 那么 webpack 在打包时就会将组件模块打包到一起(比如全部打包到 app.js 文件中) 随着项目的不断庞大,app.js 文件的内容过大,会造成 首屏的渲染速度变慢 所以,对于一些不需要立即使用的组件,我们可以对其进行拆分,单独打包 拆分成一个个 chunk.js 这些 chunk.js 会在需要的时候,从服务器上加载下来,并运行对应的代码 Vue 中也有类似的方法 6、异步组件在大型应用中,我们可能需要将应用分割成小一些的代码块 并且只在需要的时候才从服务器加载一个模块 Vue 中有一个 defineAsyncComponent 方法可以实现上述需求 用法如下:
在局部注册组件时,也可以使用?defineAsyncComponent
对于高阶用法,defineAsyncComponent 可以接受一个对象
6.1 Suspense是一个实验性的新特性 提供两个插槽,fallback 为备用的 7、模板引用尽管存在 prop 和事件,但有时我们可能仍然需要直接访问 JavaScript 中的子组件 这个时候,我们可以使用 $refs 同样,作为子组件,我们可以通过 $parent 和 $root 访问父组件中的元素 8、生命周期所有的生命周期钩子自动绑定 this 上下文到实例中 这也意味着我们 不能使用箭头函数来定义一个生命周期方法 下面来介绍一下什么是生命周期 每个组件都可能会经历从?创建、挂载、更新以及卸载?等一系列的过程? ? ?? 在这个过程中的?某一个阶段,我们可能会想要?添加一些属于自己的代码逻辑 但是我们如果想要知道目前组件正处于哪一个阶段的话 需要借助 Vue 给我们提供的关于组件的?生命周期函数 生命周期函数: 生命周期函数是一些钩子,在某个时间会被 Vue 源码内部进行回调 通过对生命周期函数的回调,我们可以知道目前组件正在经历什么阶段 那么我们就可以在该生命周期中编写属于自己的代码 生命周期图示: 9、组件的 v-model默认情况下,组件上的 v-model 使用 modelValue 作为 prop update:modelValue 作为事件 不太懂? |
|
JavaScript知识库 最新文章 |
ES6的相关知识点 |
react 函数式组件 & react其他一些总结 |
Vue基础超详细 |
前端JS也可以连点成线(Vue中运用 AntVG6) |
Vue事件处理的基本使用 |
Vue后台项目的记录 (一) |
前后端分离vue跨域,devServer配置proxy代理 |
TypeScript |
初识vuex |
vue项目安装包指令收集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年4日历 | -2025/4/21 8:41:54- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |