1.动态组件

在某些场景,往往需要我们动态切换页面部分区域的视图,这个时候内置组件component就显得尤为重要。

component接收一个名为is的属性,is的值应为父组件中注册过的组件的名称,用法如下:

  <component :is="view"></component>

示例如下:

Example.vue:

 <template>
<div id="app">
<ul class="tabs">
<li class="per-tab" @click="toggleView('Home')">Home</li>
<li class="per-tab" @click="toggleView('About')">About</li>
</ul>
<div class="tab-content">
<component :is="view"></component>
</div>
</div>
</template> <script>
let Home = { //Home组件
template: '<p style="color: #787878;">Hello Home!</p>'
}
let About = { //About组件
template: '<p>Hello About!</p>'
}
export default {
name: '#app',
components: {Home, About}, //组件注册
data() {
return {
view: 'Home'
}
},
methods: {
toggleView(view) {
this.view = view
}
}
}
</script> <style scoped>
.tabs{
margin: 0;
padding: 0;
list-style: none;
}
.per-tab {
display: inline-block;
width: 120px;
line-height: 32px;
border-left: 1px solid #ccc;
border-top: 1px solid #ccc;
background-color: azure;
}
.per-tab:last-child {
border-right: 1px solid #ccc;
}
.tab-content {
background-color: aqua;
height: 240px;
border: 1px solid #ccc;
}
</style>

效果:

默认显示:                                                  当我们点击About标签时:

     

2.插槽:

示例:

 <template>
<slot-test>
<p>使用插槽分发内容</p>
<h1 slot="header">插槽测试!</h1>
<p>在组件中,没有指定插槽名称的元素将被置于默认插槽中</p>
<p slot="none">指定到不存在的插槽中的内容将不会被显示</p>
</slot-test>
</template> <script>
let SlotTest = {
template: '<div>' +
'<slot name="header">相当于占位元素,因此这些文字也不会被渲染</slot>' + // 具名插槽
'<slot></slot>' + // 默认插槽
'</div>'
}
export default {
name: '',
components: {SlotTest}
}
</script> <style scoped> </style>

我们看到由于3和5行没有指定name,所以插槽会使用么人插槽,也就是14行;而如果有name属性但是插槽

中没有与此相匹配的,那将会不显示,如第6行。

所以输出的结果就是:

3.组件的缓冲:

keep-alive是一个抽象组件,及他既不渲染任何DOM元素,也不会出现在组件结构树中。我们可以使用他缓存

一些非动态的组件实例(没有或不需要数据变化),以保留组件状态或减少重新渲染的开销。

keep-alive应出现在组件被移除之后需要再次挂在的地方,比如使用动态组件时:

       <keep-alive>
<component :is="view"></component>
</keep-alive>

或者使用v-if时:

     <keep-alive>
<one v-if="isOne"></one>
<two v-else></two>
</keep-alive>

4.过渡效果:

(1)单节点过渡:

Vue提供了标签为transition的内置组件,在下列情形中,我们可以给任何元素和组件添加进入/离开时的

过渡动画:

①元素或组件初始渲染时;

②元素或组件显示/隐藏时(使用v-if或v-show进行条件渲染时)

③元素或组件切换时

Vue允许用户使用CSS和JS两种方式来定义过渡动画。

在使用CSS过渡时,我们需要预置符合Vue规则的带样式的类名,这些类名用于定义过渡不同阶段时的样式:

①v-enter:定义进入过渡的开始状态。在元素被插入前生效,被插入后的下一帧移除;

②v-enter-active:定义进入过渡生效时的状态。在整个进入过渡阶段中应用,在元素被插入之前生效,

在过渡/动画完成之后移除。这个类可以用来定义进入过渡的过程时间、延迟的曲线函

数等;

③v-enter-to:(Vue 2.1.8 及以上版本)定义进入过渡结束时的状态。在元素被插入后的下一帧(此时

v-enter被移除),在过渡/动画完成之后移除;

④v-leave:定义离开过渡的开始状态。在离开过渡被触发时立刻生效,下一阵被移除;

⑤v-leave-active:丁一离开过渡生效时的状态。在整个离开过度的阶段中应用,在离开过渡被触发时立

刻生效,在过渡/动画完成之后移除。这个类可以被用来定义离开过度的过程时间、延迟

和曲线函数。

⑥v-leave-to:(Vue 2.1.8 版及以上版本)定义来开过度的结束状态。在离开过度被触发之后的下一帧生

效(此时v-leave被移除),在过渡/动画完成之后移除。

注:当失利中存在多个不同的动画效果时,我们可以使用自定义前缀替换v-,比如使用slide-enter替换v-enter

,不过这需要赋予transition元素name属性

到此为止,这六个定义是不是听起来很令人摸不到头脑呀?下面给大家个图,助你理解:

下面让我们看一个示例:

 <template>
<div id="app">
<button @click="isHidden = !isHidden">
{{ isHidden ? '显示' : '隐藏' }}
</button>
<!-- 默认前缀的过渡 -->
<transition>
<p v-if="!isHidden">使用默认前缀的过渡</p>
</transition>
<!-- 自定义前缀的过渡,transitionName为变量 -->
<transition :name="transtionName">
<p v-if="!isHidden">使用rotate前缀的过渡</p>
</transition>
</div>
</template> <script>
export default {
name: '',
data() {
return {
isHidden: true,
transtionName: 'rotate' // 如果在运行时,将transitionName改为v会怎样? }
}
}
</script> <style scoped>
.v-enter,
.v-leave-to {
opacity: 0;
}
.v-enter-active,
.v-leave-active {
transition-property: opacity; /* 过渡属性 */
transition-delay: 100ms; /* 延迟 */
transition-duration: 900ms; /* 过渡时长 */
transition-timing-function: linear; /* 贝塞尔曲线(动画速度曲线) */
}
.rotate-enter,
.rotate-leave-to {
transform: rotateY(90deg);
}
.rotate-enter-active,
.rotate-leave-active {
transform-origin: left;
transition: transform 1s linear;
}
</style>

结果(由于不能插入mp4,所以这里就搞个静态的截图吧,从左到右,第一章是未点击显示按钮,第二张是点击

显示按钮,第三张是再次点击显示按钮):

     

下面让我们来看一段代码:

这里我们引入了一个新概念key:当元素的key值发生变化时,Vue不回复用原有的元素,而将重建新的元素。根

据这一特点,我们可以通过改变元素的key值来触发过渡动画,这常被用在元素切换时。

 <template>
<div id="app">
<button @click="isMaster = !isMaster">切换身份</button>
<transition>
<!-- 此处只写了一个p标签 -->
<p :key="isMaster ? 'master' : 'other'">{{ isMaster ? '大家好!' : '东家好!' }}</p>
</transition>
</div>
</template> <script>
export default {
name: '#app',
data () {
return {
isMaster: true
}
}
}
</script> <style scoped>
.v-enter, .v-leave-to {
opacity: 0;
}
.v-enter-active, .v-leave-active {
transition: opacity 1s;
}
</style>

在浏览器打开如图1,点击切换身份(如图二到三)在身份切换过程中点击切换后前者并没有立刻消失,而是随着

另一个身份的出现而渐渐消失,此间两者都存在,那么如何解决这个问题嘞?

解决问题,修改如下代码,这时候上面那个两个身份同时出现的bug就消除啦:

     <transition mode="out-in">
<!-- 此处只写了一个p标签 -->
<p :key="isMaster ? 'master' : 'other'">{{ isMaster ? '大家好!' : '东家好!' }}</p>
</transition>

(二)多节点过渡:

 <template>
<div id="app">
<button @click="addNewItem()">添加元素</button>
<br>
<transition-group name="list" tag="ul">
<li v-for="item in list" :key="item">{{ item }}</li>
</transition-group>
</div>
</template> <script>
export default {
name: '#app',
data () {
return {
list: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
}
},
methods: {
addNewItem () {
this.list.push(this.list.length)
}
}
}
</script> <style scoped>
.list-enter, .list-leave-to {
opacity: 0;
transform: translateY(30px);
}
.list-enter-active,
.list-leave-active {
transition: all 1s linear;
}
</style>

结果(点击添加元素,新的元素便会过渡出现,如下图所示):

最后提供一个元素随机排序的简单的项目,读者们可以copy下来自己玩一下,里面涉及的逻辑不是很难

 <template>
<div id="app">
<button @click="orderByRandom()">随机顺序</button>
<br>
<transition-group name="list" tag="ul">
<li v-for="item in list" :key="item">{{ item }}</li>
</transition-group>
</div>
</template> <script>
export default {
name: '#app',
data () {
return {
list: [0, 1, 2, 3, 4]
}
},
methods: {
orderByRandom () { // 随机改变数组元素的位置
let tmp = [] // 初始化新数组
for (let i = 0; i < this.list.length; i++) {
let num = Math.floor(Math.random() * (this.list.length - 0.001)) // 随机新元素
// 当元素不在数组中时,将其加入到数组中
let index = tmp.indexOf(num)
while (index !== -1) {
num = Math.floor(Math.random() * (this.list.length - 0.001))
index = tmp.indexOf(num)
}
tmp.push(num)
}
this.list = tmp // 更改list为新的数组
}
}
}
</script> <style scoped>
.list-move { /* 定义过渡效果 */
transition: transform 1s;
}
</style>

所有代码都在,读者可自行下载:https://github.com/Stray-Kite/Vue_entry_practice/tree/master/chapter05

Vue内置组件[回顾]的更多相关文章

  1. Vue内置组件keep-alive的使用

    本文主要介绍Vue内置组件keep-alive的使用. Vue内置组件keep-alive的使用 keep-alive接收三个props:●include - 字符串或正则表达式.只有名称匹配的组件会 ...

  2. 通俗易懂了解Vue内置组件keep-alive内部原理

    1. 官方介绍及其用法 1.1 组件介绍 要想搞明白<keep-alive>组件的内部实现原理,首先我们得搞明白这个组件怎么用以及为什么要用它,关于<keep-alive>组件 ...

  3. vue内置组件 transition 和 keep-alive 使用

    1.transition name - string,用于自动生成 CSS 过渡类名.例如:name: 'fade' 将自动拓展为.fade-enter,.fade-enter-active等.默认类 ...

  4. vue内置组件——transition简单原理图文详解

    基本概念 Vue 在插入.更新或者移除 DOM 时,提供多种不同方式的应用过渡效果 在 CSS 过渡和动画中自动应用 class 可以配合使用第三方 CSS 动画库,如 Animate.css 在过渡 ...

  5. 阅读vue源码-----内置组件篇(keep-alive)

    1.前言: <keep-alive>是vue实现的一个内置组件,也就是说vue源码不仅实现了一套组件化的机制,也实现了一些内置组件. <keep-alive>官网介绍如下:&l ...

  6. Vue基础(环境配置、内部指令、全局API、选项、内置组件)

    1.环境配置 安装VsCode 安装包管理工具:直接下载 NodeJS 进行安装即可,NodeJS自带 Npm 包管理工具,下载地址:https://nodejs.org/en/download/安装 ...

  7. vue第十一单元(内置组件)

    第十一单元(内置组件) #课程目标 熟练掌握component组件的用法 熟练使用keep-alive组件 #知识点 #1.component组件 component是vue的一个内置组件,作用是:配 ...

  8. form-create教程:给内置组件和自定义组件添加事件

    本文将介绍form-create如何给内置组件和自定义组件添加事件 form-create 是一个可以通过 JSON 生成具有动态渲染.数据收集.验证和提交功能的表单生成器.并且支持生成任何 Vue ...

  9. vue-learning:34 - component - 内置组件 - 缓存组件keep-alive

    vue内置缓存组件keep-alive <keep-alive>标签内包裹的组件切换时会缓存组件实例,而不是销毁它们.避免多次加载相应的组件,减少性能消耗.并且当组件在 <keep- ...

随机推荐

  1. 【原创】CentOS 7 安装解压版mysql5.7

    1.将mysql压缩包解压至 /usr/local 文件夹下,将其改名为mysql #解压 tar -zxf mysql-5.7.27-el7-x86_64.tar.gz -C /usr/local/ ...

  2. Python—文件读写操作

    初识文件操作 使用open()函数打开一个文件,获取到文件句柄,然后通过文件句柄就可以进行各种各样的操作了,根据打开文件的方式不同能够执行的操作也会有相应的差异. 打开文件的方式: r, w, a, ...

  3. 渗透测试学习 十三、 SQLmap使用详解

    SQLmap介绍 sqlmap是一个由python语言编写的开源的渗透测试工具,它主要是检测SQL注入漏洞,是一款功能强大的SQL漏洞检测利用工具. 他可以检测的数据库有:access.msSQL.M ...

  4. C学习笔记(3)---作用域,数组, (少量指针入门)

    1. 作用域(scope):任何一种编程中,作用域是程序中定义的变量所存在的区域,超过该区域变量就不能被访问.C 语言中有三个地方可以声明变量. a. 在函数或块内部的局部变量 - 在某个函数或块的内 ...

  5. Host '10.133.3.34' is not allowed to connect to this MySQL server mysql 本地拒接连接

    mysql 本地拒接连接 解决方案是,把mysql库中的user表的host 改成% 运行所电脑连接 也可以把第一行复制一遍  把localhost改成你要连接电脑的ip(推荐这改,这样安全一点) 改 ...

  6. base46+url编码

    base64解密+unquote url编码 html = ''' JTdCJTIyc3RvcmUlMjIlM0ElN0IlMjJnYW1lTGlicmFyeSUyMiUzQSU3QiUyMmRpc2 ...

  7. 详解C++ STL multiset 容器

    详解C++ STL multiset 容器 本篇随笔简单介绍一下\(C++STL\)中\(multiset\)容器的使用方法及常见使用技巧. multiset容器的概念和性质 \(set\)在英文中的 ...

  8. 小程序setData()使用和注意事项

    注意: 直接修改this.data,而不调用this.setData(),是无法改变当前页面的状态的,会导致数据不一致 仅支持可以JSON化的数据 单次设置的数据不能超过1024KB,尽量避免一次设置 ...

  9. react中使用动画

    1. css原生动画的使用 import React, { useState } from "react" import "./index.css" funct ...

  10. Linux学习笔记-第12天 实用的一章

    关键词nmtui.nm-connection-editor./etc/sysconfig/network-scripts.iptables.firewalld.firewall-cmd.firewal ...