经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » HTML/CSS » HTML5 » 查看文章
Vue内置组件[回顾]
来源:cnblogs  作者:迷途纸鸢  时间:2019/8/7 8:47:21  对本文有异议

1.动态组件

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

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

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

 示例如下:

Example.vue:

  1. 1 <template>
  2. 2 <div id="app">
  3. 3 <ul class="tabs">
  4. 4 <li class="per-tab" @click="toggleView('Home')">Home</li>
  5. 5 <li class="per-tab" @click="toggleView('About')">About</li>
  6. 6 </ul>
  7. 7 <div class="tab-content">
  8. 8 <component :is="view"></component>
  9. 9 </div>
  10. 10 </div>
  11. 11 </template>
  12. 12
  13. 13 <script>
  14. 14 let Home = { //Home组件
  15. 15 template: '<p style="color: #787878;">Hello Home!</p>'
  16. 16 }
  17. 17 let About = { //About组件
  18. 18 template: '<p>Hello About!</p>'
  19. 19 }
  20. 20 export default {
  21. 21 name: '#app',
  22. 22 components: {Home, About}, //组件注册
  23. 23 data() {
  24. 24 return {
  25. 25 view: 'Home'
  26. 26 }
  27. 27 },
  28. 28 methods: {
  29. 29 toggleView(view) {
  30. 30 this.view = view
  31. 31 }
  32. 32 }
  33. 33 }
  34. 34 </script>
  35. 35
  36. 36 <style scoped>
  37. 37 .tabs{
  38. 38 margin: 0;
  39. 39 padding: 0;
  40. 40 list-style: none;
  41. 41 }
  42. 42 .per-tab {
  43. 43 display: inline-block;
  44. 44 width: 120px;
  45. 45 line-height: 32px;
  46. 46 border-left: 1px solid #ccc;
  47. 47 border-top: 1px solid #ccc;
  48. 48 background-color: azure;
  49. 49 }
  50. 50 .per-tab:last-child {
  51. 51 border-right: 1px solid #ccc;
  52. 52 }
  53. 53 .tab-content {
  54. 54 background-color: aqua;
  55. 55 height: 240px;
  56. 56 border: 1px solid #ccc;
  57. 57 }
  58. 58 </style>

效果:

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

         

2.插槽:

示例:

  1. 1 <template>
  2. 2 <slot-test>
  3. 3 <p>使用插槽分发内容</p>
  4. 4 <h1 slot="header">插槽测试!</h1>
  5. 5 <p>在组件中,没有指定插槽名称的元素将被置于默认插槽中</p>
  6. 6 <p slot="none">指定到不存在的插槽中的内容将不会被显示</p>
  7. 7 </slot-test>
  8. 8 </template>
  9. 9
  10. 10 <script>
  11. 11 let SlotTest = {
  12. 12 template: '<div>' +
  13. 13 '<slot name="header">相当于占位元素,因此这些文字也不会被渲染</slot>' + // 具名插槽
  14. 14 '<slot></slot>' + // 默认插槽
  15. 15 '</div>'
  16. 16 }
  17. 17 export default {
  18. 18 name: '',
  19. 19 components: {SlotTest}
  20. 20 }
  21. 21 </script>
  22. 22
  23. 23 <style scoped>
  24. 24
  25. 25 </style>

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

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

所以输出的结果就是:

 

3.组件的缓冲:

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

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

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

 

  1. 1 <keep-alive>
  2. 2 <component :is="view"></component>
  3. 3 </keep-alive>

 

或者使用v-if时:

  1. 1 <keep-alive>
  2. 2 <one v-if="isOne"></one>
  3. 3 <two v-else></two>
  4. 4 </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属性

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

      

 

       下面让我们看一个示例:

  1. 1 <template>
  2. 2 <div id="app">
  3. 3 <button @click="isHidden = !isHidden">
  4. 4 {{ isHidden ? '显示' : '隐藏' }}
  5. 5 </button>
  6. 6 <!-- 默认前缀的过渡 -->
  7. 7 <transition>
  8. 8 <p v-if="!isHidden">使用默认前缀的过渡</p>
  9. 9 </transition>
  10. 10 <!-- 自定义前缀的过渡,transitionName为变量 -->
  11. 11 <transition :name="transtionName">
  12. 12 <p v-if="!isHidden">使用rotate前缀的过渡</p>
  13. 13 </transition>
  14. 14 </div>
  15. 15 </template>
  16. 16
  17. 17 <script>
  18. 18 export default {
  19. 19 name: '',
  20. 20 data() {
  21. 21 return {
  22. 22 isHidden: true,
  23. 23 transtionName: 'rotate' // 如果在运行时,将transitionName改为v会怎样?
  24. 24
  25. 25 }
  26. 26 }
  27. 27 }
  28. 28 </script>
  29. 29
  30. 30 <style scoped>
  31. 31 .v-enter,
  32. 32 .v-leave-to {
  33. 33 opacity: 0;
  34. 34 }
  35. 35 .v-enter-active,
  36. 36 .v-leave-active {
  37. 37 transition-property: opacity; /* 过渡属性 */
  38. 38 transition-delay: 100ms; /* 延迟 */
  39. 39 transition-duration: 900ms; /* 过渡时长 */
  40. 40 transition-timing-function: linear; /* 贝塞尔曲线(动画速度曲线) */
  41. 41 }
  42. 42 .rotate-enter,
  43. 43 .rotate-leave-to {
  44. 44 transform: rotateY(90deg);
  45. 45 }
  46. 46 .rotate-enter-active,
  47. 47 .rotate-leave-active {
  48. 48 transform-origin: left;
  49. 49 transition: transform 1s linear;
  50. 50 }
  51. 51 </style>

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

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

            

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

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

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

  1. 1 <template>
  2. 2 <div id="app">
  3. 3 <button @click="isMaster = !isMaster">切换身份</button>
  4. 4 <transition>
  5. 5 <!-- 此处只写了一个p标签 -->
  6. 6 <p :key="isMaster ? 'master' : 'other'">{{ isMaster ? '大家好!' : '东家好!' }}</p>
  7. 7 </transition>
  8. 8 </div>
  9. 9 </template>
  10. 10
  11. 11 <script>
  12. 12 export default {
  13. 13 name: '#app',
  14. 14 data () {
  15. 15 return {
  16. 16 isMaster: true
  17. 17 }
  18. 18 }
  19. 19 }
  20. 20 </script>
  21. 21
  22. 22 <style scoped>
  23. 23 .v-enter, .v-leave-to {
  24. 24 opacity: 0;
  25. 25 }
  26. 26 .v-enter-active, .v-leave-active {
  27. 27 transition: opacity 1s;
  28. 28 }
  29. 29 </style>

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

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

      

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

 

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

 

(二)多节点过渡:

  1. 1 <template>
  2. 2 <div id="app">
  3. 3 <button @click="addNewItem()">添加元素</button>
  4. 4 <br>
  5. 5 <transition-group name="list" tag="ul">
  6. 6 <li v-for="item in list" :key="item">{{ item }}</li>
  7. 7 </transition-group>
  8. 8 </div>
  9. 9 </template>
  10. 10
  11. 11 <script>
  12. 12 export default {
  13. 13 name: '#app',
  14. 14 data () {
  15. 15 return {
  16. 16 list: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  17. 17 }
  18. 18 },
  19. 19 methods: {
  20. 20 addNewItem () {
  21. 21 this.list.push(this.list.length)
  22. 22 }
  23. 23 }
  24. 24 }
  25. 25 </script>
  26. 26
  27. 27 <style scoped>
  28. 28 .list-enter, .list-leave-to {
  29. 29 opacity: 0;
  30. 30 transform: translateY(30px);
  31. 31 }
  32. 32 .list-enter-active,
  33. 33 .list-leave-active {
  34. 34 transition: all 1s linear;
  35. 35 }
  36. 36 </style>

 

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

     

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

  1. 1 <template>
  2. 2 <div id="app">
  3. 3 <button @click="orderByRandom()">随机顺序</button>
  4. 4 <br>
  5. 5 <transition-group name="list" tag="ul">
  6. 6 <li v-for="item in list" :key="item">{{ item }}</li>
  7. 7 </transition-group>
  8. 8 </div>
  9. 9 </template>
  10. 10
  11. 11 <script>
  12. 12 export default {
  13. 13 name: '#app',
  14. 14 data () {
  15. 15 return {
  16. 16 list: [0, 1, 2, 3, 4]
  17. 17 }
  18. 18 },
  19. 19 methods: {
  20. 20 orderByRandom () { // 随机改变数组元素的位置
  21. 21 let tmp = [] // 初始化新数组
  22. 22 for (let i = 0; i < this.list.length; i++) {
  23. 23 let num = Math.floor(Math.random() * (this.list.length - 0.001)) // 随机新元素
  24. 24 // 当元素不在数组中时,将其加入到数组中
  25. 25 let index = tmp.indexOf(num)
  26. 26 while (index !== -1) {
  27. 27 num = Math.floor(Math.random() * (this.list.length - 0.001))
  28. 28 index = tmp.indexOf(num)
  29. 29 }
  30. 30 tmp.push(num)
  31. 31 }
  32. 32 this.list = tmp // 更改list为新的数组
  33. 33 }
  34. 34 }
  35. 35 }
  36. 36 </script>
  37. 37
  38. 38 <style scoped>
  39. 39 .list-move { /* 定义过渡效果 */
  40. 40 transition: transform 1s;
  41. 41 }
  42. 42 </style>

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

 

原文链接:http://www.cnblogs.com/Trojan00/p/11310633.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号