• Vue过渡效果组件、组件分发、组件ref使用


    过渡效果组件

    • 组件名:transition
    • 组件名:transition-group
    • 作用:用于为vue项目中 组件、路由、页面提供通过vue语法控制切换过程中的css 动画

    vue 提供动画组件通过包裹元素方式,实现主动监控根元素vue语法执行的同时增加合理的延迟实现自定义动画操作

                    + 动画组件可以配合 v-if v-show 动态组件 路由组件 ……

                    + CSS 动画从方向上分为两种,每种三过程

                        1. 从不显示到显示(进入)enter

                            a.不显示时的样式 from

                            b.css动画的执行过程 active

                            c.显示时的样式 to

                        2. 从显示到不显示(离开)leave

                            a.显示时的样式 from

                            b.css动画的执行过程 active

                            c.不显示时的样式 to

                 只用于一个根元素的动画监控

                用于多个根元素的动画分别监控 (必须为所有内部的元素提供key)

                特殊属性

                    :appear="true"  // 开启默认的进入动画执行

                    appear-from-class="hide2"

                    appear-active-class="active"

                    appear-to-class="show2"

    1. <style>
    2. body{
    3. padding-bottom: 800px;
    4. }
    5. .box{
    6. width: 400px;
    7. height: 200px;
    8. background-color: brown;
    9. color: white;
    10. }
    11. .show{
    12. opacity: 1;
    13. }
    14. .show1{
    15. width: 400px;
    16. }
    17. .active{
    18. transition: all ease 2s;
    19. }
    20. .hide{
    21. opacity: 0;
    22. }
    23. .hide1{
    24. width: 0px;
    25. }
    26. ul{
    27. overflow: hidden;
    28. }
    29. li{
    30. margin: 10px;
    31. background-color: paleturquoise;
    32. width: 300px;
    33. }
    34. .show2{
    35. transform: translate(0%,0px);
    36. }
    37. .hide2{
    38. transform: translate(100%,0px);
    39. }
    40. style>
    41. head>
    42. <body>
    43. <div id="app">
    44. <input type="button" value="flag=!flag" @click="flag=!flag">
    45. <br><br>
    46. <transition
    47. :appear="true"
    48. appear-from-class="hide2"
    49. appear-active-class="active"
    50. appear-to-class="show2"
    51. leave-from-class="show"
    52. leave-active-class="active"
    53. leave-to-class="hide"
    54. enter-from-class="hide1"
    55. enter-active-class="active"
    56. enter-to-class="show1"
    57. >
    58. <div v-if="flag" class="box">页面div>
    59. transition>
    60. <hr>
    61. <input type="button" value="addItem" @click="arr.push( Math.random() )">
    62. <ul>
    63. <transition-group
    64. enter-from-class="hide2"
    65. enter-active-class="active"
    66. enter-to-class="show2"
    67. @after-enter="showTip()"
    68. >
    69. <li v-for="(item, index) in arr" :key="item">{{ item }}li>
    70. transition-group>
    71. ul>
    72. div>
    73. <script type="module">
    74. import { createApp } from "../../assets/vue/3.0/vue.esm-browser.js";
    75. createApp({
    76. data(){
    77. return {
    78. flag:true,
    79. arr:[1,2,3,4,5]
    80. }
    81. },
    82. methods: {
    83. showTip(){
    84. alert("添加完成")
    85. }
    86. },
    87. }).mount("#app")
    88. script>

    外部动画的应用:Animate的应用

     

    1. <link rel="stylesheet" href="../../assets/animate/animate.css">
    2. <style>
    3. body{
    4. padding-bottom: 800px;
    5. }
    6. .box{
    7. width: 400px;
    8. height: 300px;
    9. background-color: brown;
    10. }
    11. style>
    12. head>
    13. <body>
    14. <div id="app">
    15. <input type="button" value="flag=!flag" @click="flag=!flag">
    16. <br><br>
    17. <transition
    18. enter-active-class="animate__animated animate__fadeInRight"
    19. leave-active-class="animate__animated animate__fadeOutLeft"
    20. >
    21. <div v-if="flag" class="box">div>
    22. transition>
    23. div>
    24. <script type="module">
    25. import { createApp } from "../../assets/vue/3.0/vue.esm-browser.js";
    26. createApp({
    27. data(){
    28. return {
    29. flag:true
    30. }
    31. }
    32. }).mount("#app")
    33. script>

     红色标记部分为该css引用文件自带,后面为Animate动画名称

    组件分发

    • 组件名:slot :
    • 作用:针对于组件定义时的内部模板结构的操作,==主要在组件开发时,如果模板存在一部分页面代码无法确定,可以通过slot 定义页面占位,当组件调用时,可以通过标签中定义 新的内容,完成 slot 的内容补充==
    • 涉及属性: v-slot 指令

    1. .btn{
    2. display: inline-block;
    3. padding: 10px 20px;
    4. border: 1px solid #dedede;
    5. cursor: pointer;
    6. border-radius: 6px;
    7. background-color: #409eff;
    8. color: white;
    9. }
    10. .btn img{
    11. height: 16px;
    12. }
    13. .btn:hover{
    14. filter: opacity(0.8);
    15. }
    16. style>
    17. head>
    18. <body>
    19. <div id="app">
    20. <h4>按钮组件h4>
    21. <br>
    22. <itany-btn>注册itany-btn>
    23. <itany-btn>登录itany-btn>
    24. <itany-btn>退出itany-btn>
    25. <itany-btn>
    26. <i class="iconfont icon-edit">i>
    27. 退出
    28. itany-btn>
    29. <br><br>
    30. <itany-btn>
    31. <span>默认分发内容span>
    32. <template v-slot:loading>
    33. <img src="../../assets/img/loading.gif" alt="" srcset="">
    34. template>
    35. itany-btn>
    36. <br><br>
    37. <itany-btn>
    38. <span>默认分发内容span>
    39. <template #loading>
    40. <img src="../../assets/img/loading.gif" alt="" srcset="">
    41. template>
    42. itany-btn>
    43. <br><br>
    44. <itany-btn>
    45. <template #default>
    46. <span>默认分发内容span>
    47. template>
    48. <template #loading>
    49. <img src="../../assets/img/loading.gif" alt="" srcset="">
    50. template>
    51. itany-btn>
    52. <br><br>
    53. <itany-btn>itany-btn>
    54. <br><br>
    55. <itany-btn name="name属性">itany-btn>
    56. <br><br>
    57. <itany-btn name="name属性">
    58. <span>默认插槽span>
    59. itany-btn>
    60. div>
    61. <script type="text/x-template" id="itanyBtn">
    62. <div class="btn">
    63. <slot name="loading">loadingslot>
    64. |
    65. <slot>{{ name }}slot>
    66. div>
    67. script>
    68. <script type="module">
    69. import { createApp } from "../../assets/vue/3.0/vue.esm-browser.js";
    70. createApp({
    71. data(){
    72. return {
    73. }
    74. }
    75. })
    76. .component("ItanyBtn",{
    77. template:"#itanyBtn",
    78. props:{
    79. name:{
    80. type:String,
    81. default:"默认数据"
    82. }
    83. }
    84. })
    85. .mount("#app")
    86. script>

    插槽的作用域分发

     vue中所谓的作用域插槽,实际上就是实现子组件渲染时将一些特殊数据变量,

                                  通过插槽关系回传到调用位置(父组件位置)进行使用

           

            子组件调用时的内容区域可以通过vue的语法关系构建出两个 取值作用域

                1、父组件作用域 : 子组件调用时内容区域的默认作用域  【 标签定义在那个容器,作用域就是那个容器 】

                2、子组件回传数据作用域 : (实现规则就是属性绑定+数据拦截)

                                         + 属性绑定 在 slot 标签上以 v-bind 完成子组件数据绑定

                                         + 在子组件标签的内容区域,通过 v-slot="自定义变量" 进行拦截

                                                自定义变量 以取值 {} 等方式记录所有对应 slot 上绑定的属性

    1. <body>
    2. <div id="app">
    3. <h3>列表组件h3>
    4. <itany-list :list="users">
    5. <template v-slot:default="obj">
    6. <div>{{ msg }}div>
    7. <div>{{ obj }}div>
    8. <div>{{ obj.info }}div>
    9. <div>{{ obj.row.name }}div>
    10. template>
    11. itany-list>
    12. <hr>
    13. <itany-list :list="users2" v-slot="obj">
    14. {{ obj.row.username }}
    15. itany-list>
    16. <hr>
    17. <itany-list :list="users2" v-slot="{ row,$index }">
    18. {{ $index }}:{{ row.username }}
    19. <input type="text" v-model="users2[$index].username">
    20. <input type="text" v-model="row.username">
    21. itany-list>
    22. div>
    23. <script type="text/x-template" id="list">
    24. <slot name="empty" v-if="list.length==0">{{ emptyText }}slot>
    25. <ul>
    26. <li v-for="(item,i) in list">
    27. <slot v-bind:info="info" :row="item" :$index="i">slot>
    28. li>
    29. ul>
    30. script>
    31. <script src="../../assets/mock/mock.js">script>
    32. <script type="module">
    33. import { createApp } from "../../assets/vue/3.0/vue.esm-browser.js";
    34. createApp({
    35. data(){
    36. return {
    37. msg:"父组件测试数据",
    38. users:Mock.mock({
    39. "list|10-10":[
    40. {
    41. id:"@id",
    42. name:"@cname"
    43. }
    44. ]
    45. }).list,
    46. users2:Mock.mock({
    47. "list|10-10":[
    48. {
    49. id:"@id",
    50. username:"@cname"
    51. }
    52. ]
    53. }).list
    54. }
    55. }
    56. })
    57. .component("ItanyList",{
    58. template:"#list",
    59. data() {
    60. return {
    61. info:"子组件数据"
    62. }
    63. },
    64. props:{
    65. list:{
    66. type:Array,
    67. default(){
    68. return []
    69. }
    70. },
    71. emptyText:{
    72. type:String,
    73. default:"暂无数据"
    74. }
    75. }
    76. })
    77. .mount("#app")
    78. script>

    组件ref用法

     

    // 通过$refs可以直接访问组件对象,通过组件对象可以直接调用组件方法

    例:模态窗组件创建

    1. <style>
    2. body{
    3. padding-bottom: 800px;
    4. }
    5. .dialog{
    6. position: fixed;
    7. top:0px;
    8. bottom: 0px;
    9. left: 0px;
    10. right: 0px;
    11. /* width: 100%;
    12. height: 100%; */
    13. background-color: rgba(51, 51, 51, 0.6);
    14. }
    15. .dialog-box{
    16. position: absolute;
    17. top: 10%;
    18. left: 50%;
    19. transform: translate(-50%,0px);
    20. background-color: white;
    21. width: 400px;
    22. min-height: 400px;
    23. box-shadow: 0px 0px 8px #dedede;
    24. }
    25. style>
    26. head>
    27. <body>
    28. <div id="app">
    29. <h4>模态窗组件h4>
    30. <ul>
    31. <li v-for="(u, i) in users" :key="u.id">
    32. {{ u.name }}
    33. <input type="button" value="修改" @click="showEditDialog(u)">
    34. li>
    35. ul>
    36. <itany-dialog v-model:flag="dialogFlag" ref="editUser">
    37. <div>
    38. <label>ID:label>
    39. <input type="text" readonly :value="tempUser.id">
    40. div>
    41. <div>
    42. <label>name:label>
    43. <input type="text" v-model="tempUser.name">
    44. div>
    45. <input type="button" value="关闭" @click="dialogFlag=false">
    46. <input type="button" value="修改" @click="editUser()">
    47. itany-dialog>
    48. div>
    49. <script type="text/x-template" id="dialog">
    50. <teleport to="body" >
    51. <div class="dialog" v-if="flag" @click="$emit('update:flag',false)">
    52. <div class="dialog-box" @click.stop>
    53. <slot>slot>
    54. div>
    55. div>
    56. teleport>
    57. script>
    58. <script src="../../assets/mock/mock.js">script>
    59. <script type="module">
    60. import { createApp } from "../../assets/vue/3.0/vue.esm-browser.js";
    61. createApp({
    62. data(){
    63. return {
    64. dialogFlag:false,
    65. users:Mock.mock({
    66. "list|10-10":[
    67. {
    68. id:"@id",
    69. name:"@cname"
    70. }
    71. ]
    72. }).list,
    73. tempUser:{}
    74. }
    75. },
    76. methods: {
    77. showEditDialog(u){
    78. // this.dialogFlag = true;
    79. console.log(this.$refs.editUser);
    80. // 通过$refs可以直接访问组件对象,通过组件对象可以直接调用组件方法
    81. this.$refs.editUser.open();
    82. this.tempUser = u;
    83. },
    84. editUser(){
    85. console.log("被修改的数据:",this.tempUser);
    86. this.dialogFlag = false;
    87. }
    88. },
    89. })
    90. .component("ItanyDialog",{
    91. template:"#dialog",
    92. emits:["update:flag"],
    93. props:{
    94. flag:{
    95. type:Boolean,
    96. default:false
    97. }
    98. },
    99. methods:{
    100. open(){
    101. console.log("模态窗组件的自定义方法");
    102. this.$emit("update:flag",true)
    103. }
    104. }
    105. })
    106. .mount("#app")
    107. script>

  • 相关阅读:
    【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 游乐园门票 (200分) - 三语言AC题解(Python/Java/Cpp)
    【学习笔记】Servlet
    2022-06-08你抢不到的可达鸭,芯片成本只要几块钱KFC(-JPG)
    python运算符重载之构造函数和迭代器
    C++文件操作解析及使用(读、写文件 使用文件指针)
    部署Docker玩转Docker
    初识Docker
    Vue公共loading升级版(处理并发异步差时响应)
    R数据分析:解决科研中的“可重复危机”,理解Rmarkdown
    【VASP】POSCAR文件
  • 原文地址:https://blog.csdn.net/m0_62168050/article/details/126967644