前端小白的学习之路(Vue2 四)

这篇具有很好参考价值的文章主要介绍了前端小白的学习之路(Vue2 四)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

提示:学习vue2的第四天,笔记记录:混入(mixins),插槽(slot),过渡与动画(transition)

目录

一、混入(mixins)

二、插槽(solt)

1.匿名插槽

2.具名插槽

三、过渡与动画(transition) 

1.过渡

1)单元素过渡

Ⅰ.通用类名

Ⅱ.指定类名

2)多元素过渡 

2.动画 

1.自定义动画

2.使用动画库 


一、混入(mixins)

混入(Mixin)是一种重用 Vue 组件中可复用功能的方法,它允许你在多个组件之间共享相同的代码逻辑。通过混入,你可以将一组选项合并到组件中,这些选项可以包括数据、计算属性、方法等。

基本步骤:

1.创建混入对象:首先,创建一个包含要复用的选项的混入对象。这个对象可以包含任何 Vue 组件中可用的选项。

const options = {
  data() {
      return {
          num: 100
      }
  },
  methods: {
      add() {
          this.num++;
      }
  },
  watch: {
      num(nValue) {
          console.log("值:", nValue);
      }
  },
  created() {
      console.log("初始化...")
  }
}

2.在组件中使用混入:在你想要使用混入的组件中,通过 mixins 选项将混入对象添加到组件中。 

// 组件A
const CompA = {
    data() {
        return {
            num: 1
        }
    },
    // 混入语法
    mixins: [
        options
    ],
    template: `
        <div>
            <h3>组件A</h3>
            <p>{{num}}</p>
            <button @click="add">按钮</button>
        </div>
        `,
}
// 组件B
const CompB = {
    // 混入语法
    mixins: [
        options
    ],
    template: `
        <div>
            <h3>组件B</h3>
            <p>{{num}}</p>
            <button @click="add">按钮</button>
        </div>
        `,
}

: 当组件data选项中的数据和mixins选项中的属性和方法相同的情况,优先使用的是组件的属性和方法等 。虽然混入提供了一种方便的重用代码的方法,但过度使用混入可能导致代码变得难以理解和维护。因此,应该谨慎使用混入,避免滥用。

二、插槽(solt)

组件插槽(slot)是一种机制,允许组件接受额外的内容作为其子组件,并且可以在组件内部的特定位置渲染这些内容。插槽使得组件更加灵活,可以根据需要插入不同的内容。

1.匿名插槽

匿名插槽是最简单的一种插槽,不需要任何特定的名称。当在组件中写入内容时,如果没有为插槽指定名称,那么这个内容会被放置到子组件中的默认插槽位置。在子组件中,可以使用 <slot> 元素来标记默认插槽的位置。

<!DOCTYPE html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Vue</title>
    <style>
        * {
            padding: 0;
            margin: 0;
        }
        .header {
            width: 100%;
            box-sizing: border-box;
            padding: 0 15px;
            height: 60px;
            background-color: #ccc;
            display: flex;
            align-items: center;
            margin-bottom: 10px;
        }
        .header .left {
            width: 80px;
            height: 40px;
            background-color: red;
            text-align: center;
            line-height: 40px;
        }
        .header .left a , 
        .header .left span {
            color: #fff;
            text-decoration: none;
        }
    </style>
</head>
<body>
    <div id="app">
        <comp-header><span>搜狐  </span></comp-header>
        <comp-header><span>淘宝  </span></comp-header>
        <comp-header><span>京东  </span></comp-header>
        <comp-header><span>拼多多</span></comp-header>
    </div>
    <script src="./libs/vue@2.7.16/vue.js"></script>
    <script>

        // 匿名插槽
        // <slot></slot>
        // 编写头部组件
        const CompHeader = {
            template: `
                <header class="header">
                    <!-- 插槽 -->
                    <div class="left">
                        <slot></slot>
                    </div>
                </header>
            `
        }
        //禁止控制台输出日志信息
        Vue.config.productionTip = false;
        new Vue({
            //挂载容器
            el: "#app",
            // 注册组件
            components: {CompHeader}
        })
    </script>
</body>
</html>

在上面的案例中<comp-header> 组件中的<span>搜狐</span>等内容就会被插入匿名插槽中

2.具名插槽

与匿名插槽不同,在组件中写入的内容会根据name属性插入到用v-solt绑定了相同名称的插槽中

<!DOCTYPE html>
<html lang="zh-cn">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Vue</title>
    <style>
        * {
            padding: 0;
            margin: 0;
        }

        .header {
            width: 100%;
            box-sizing: border-box;
            padding: 0 15px;
            height: 60px;
            background-color: deepskyblue;
            display: flex;
            align-items: center;
            margin-bottom: 10px;
        }

        .header .left {
            width: 80px;
            height: 40px;
            /* background-color: red; */
            text-align: center;
            line-height: 40px;
        }

        .header .left a,
        .header .left span {
            color: #fff;
            text-decoration: none;
        }

        .header .center {
            flex-grow: 1;
        }

        .header .center input {
            width: 100%;
            height: 40px;
            border-radius: 20px;
            border: 0;
            outline: none;
            box-sizing: border-box;
            padding-left: 15px;
        }

        .header .right {
            width: 50px;
            height: 40px;
            /* background-color: blue; */
            text-align: center;
            line-height: 40px;
        }

        .header .right a {
            color: #fff;
            text-decoration: none;
        }
    </style>
</head>

<body>
    <div id="app">
        <comp-header>
            <!-- 代表left插槽 -->
            <template v-slot:left>
                <span>LOGO</span>
            </template>

            <!-- 代表center插槽 -->
            <template v-slot:center>
                <input type="text" placeholder="请输入关键字">
            </template>
            
            <!-- 代表right插槽 -->
            <template #right>
                <a href="#">登录</a>
            </template>
        </comp-header>

    </div>
    <script src="./libs/vue@2.7.16/vue.js"></script>
    <script>
        // 具名插槽
        // <slot name="left"></slot>
        // 编写头部组件
        const CompHeader = {
            template: `
                <header class="header">
                    <!-- 插槽 -->
                    <div class="left">
                        <slot name="left"></slot>
                    </div>
                    <div class="center">
                        <slot name="center"></slot>
                    </div>
                    <div class="right">
                        <slot name="right"></slot>
                    </div>
                </header>
            `
        }
        //禁止控制台输出日志信息
        Vue.config.productionTip = false;
        new Vue({
            //挂载容器
            el: "#app",
            // 注册组件
            components: { CompHeader }
        })
    </script>
</body>

</html>

在上面的案例中,v-solt:left中的logo就会 被插入到name='left'的插槽中去 

三、过渡与动画(transition) 

1.过渡

过渡(Transition)是一种在元素在插入、更新或删除时,在其内部进行过渡的方式,就是为元素的行为增加过渡效果。

1)单元素过渡

通过内置组件<transition> 可以对单个元素进行过渡动画,可以在元素插入、更新或删除时触发动画效果。它通过设置不同的 CSS 类名来实现动画效果。

Ⅰ.通用类名

没有设置name属性的<transition>组件过渡效果都会执行 .v- 开头的类名中设置的过渡效果。

<!DOCTYPE html>
<html lang="zh-cn">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Vue</title>
    <link rel="stylesheet" href="./libs/bootstrap/css/bootstrap.css">
    <style>
        /* 入场类名 */
        /* 入场之前的样式 */
        .v-enter {
            transform: translateX(-100%);
            opacity: 0;
        }
        /* 入场过程中的样式 */
        .v-enter-active {
            transition: all .5s;
        }
        .v-enter-to {
            transform: translateX(0px);
            opacity: 1;
        }


        /* 离场类名 */
        /* 离场之前的样式 */
        .v-leave {
            transform: translateY(0px);
            opacity: 1;
        }
        /* 离场过程中的样式 */
        .v-leave-active {
            transition: all .5s;
        }
        /* 离场后的样式 */
        .v-leave-to {
            transform: translateY(-100%);
            opacity: 0;
        }

    </style>
</head>

<body>
    <div id="app">
        <div class="container mt-2">
            <div class="btn btn-success" @click="isShow=true">入场(显示)</div>
            <div class="btn btn-danger" @click="isShow=false">离场(隐藏)</div>

            <transition>
                <div v-if="isShow" class="bg-primary mt-2" style="height: 200px;"></div>
            </transition>

        </div>
        

    </div>
    <script src="./libs/vue@2.7.16/vue.js"></script>
    <script>


        //禁止控制台输出日志信息
        Vue.config.productionTip = false;
        new Vue({
            //挂载容器
            el: "#app",
            // 数据
            data(){
                return {
                    isShow: true 
                }
            },


        })
    </script>
</body>

</html>
Ⅱ.指定类名

通过在<transition>中设置name属性可以调用 .name-  开头的专属类名中的过渡效果。

<!DOCTYPE html>
<html lang="zh-cn">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Vue</title>
    <link rel="stylesheet" href="./libs/bootstrap/css/bootstrap.css">
    <style>
        /* 设置transition组件的name属性为demo后 */
         /* 入场类名 */
        /* 入场之前的样式 */
        .demo-enter {
            transform: translateX(-100%) rotate(180deg);
            opacity: 0;
        }
        /* 入场过程中的样式 */
        .demo-enter-active {
            transition: all .5s;
        }
        .demo-enter-to {
            transform: translateX(0px)  rotate(0deg);
            opacity: 1;
        }


        /* 离场类名 */
        /* 离场之前的样式 */
        .demo-leave {
            transform: translateY(0px)  rotate(0deg);
            opacity: 1;
        }
        /* 离场过程中的样式 */
        .demo-leave-active {
            transition: all .5s;
        }
        /* 离场后的样式 */
        .demo-leave-to {
            transform: translateY(-100%) rotate(180deg);
            opacity: 0;
        }
    </style>
</head>

<body>
    <div id="app">
        <div class="container mt-2">
            <div class="btn btn-success" @click="isShow=true">入场(显示)</div>
            <div class="btn btn-danger" @click="isShow=false">离场(隐藏)</div>

            <transition name="demo">
                <div v-if="isShow" class="bg-primary mt-2" style="height: 200px;"></div>
            </transition>
        </div>
        

    </div>
    <script src="./libs/vue@2.7.16/vue.js"></script>
    <script>


        //禁止控制台输出日志信息
        Vue.config.productionTip = false;
        new Vue({
            //挂载容器
            el: "#app",
            // 数据
            data(){
                return {
                    isShow: true 
                }
            },


        })
    </script>
</body>

</html>

2)多元素过渡 

通过内置组件<transition-group> 组件用于对多个相同类型的元素进行过渡动画,例如列表中的项。它也通过设置不同的 CSS 类名来实现动画效果。使用方法与 <transition> 类似,主要区别在于添加了 tag 属性指定了渲染元素的标签,默认为 span

<template>
  <div>
    <transition-group name="list" tag="ul">
      <li v-for="(item, index) in items" :key="index">{{ item }}</li>
    </transition-group>
    <button @click="addItem">添加项</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      items: ['Item 1', 'Item 2', 'Item 3']
    };
  },
  methods: {
    addItem() {
      this.items.push(`Item ${this.items.length + 1}`);
    }
  }
};
</script>

<style>
/* 定义过渡效果的 CSS 类 */
.list-enter-active, .list-leave-active {
  transition: transform 0.5s;
}
.list-enter, .list-leave-to {
  transform: translateY(30px);
  opacity: 0;
}
</style>

2.动画 

1.自定义动画

通过@keyframes来自定义动画,利用enter-active,leave-active这些属性设置过渡

<!DOCTYPE html>
<html lang="zh-cn">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Vue</title>
    <link rel="stylesheet" href="./libs/bootstrap/css/bootstrap.css">
    <style>
        /* 入场类名 */
        .enter-box {
            animation: enter-ani .5s  forwards;
        }

        /* 离场类名 */
        .leave-box {
            animation: leave-ani .5s  forwards;
        }
        

        /* 自定义动画 */
        /* 入场动画 */
        @keyframes enter-ani {
            0% {
                transform: scale(.5) rotate(180deg);
                opacity: 0;
            }
            100% {
                transform: scale(1) rotate(0deg);
                opacity: 1;
            }
        }
        /* 离场动画 */
        @keyframes leave-ani {
            0% {
                transform: scale(1) rotate(0deg);
                opacity: 1;
            }
            100% {
                transform: scale(.5) rotate(180deg);
                opacity: 0;
            }
        }
    </style>
</head>

<body>
    <div id="app">
        <div class="container mt-2">
            <div class="btn btn-success" @click="isShow=true">入场(显示)</div>
            <div class="btn btn-danger" @click="isShow=false">离场(隐藏)</div>

            <!-- 处理动画,利用enter-active,leave-active这些属性设置 -->
            <!-- 1) 自定义动画 -->
            <transition
                enter-active-class="enter-box"
                leave-active-class="leave-box"
                >
                <div v-if="isShow" class="bg-primary mt-2" style="height: 200px;"></div>
            </transition>
        </div>
        

    </div>
    <script src="./libs/vue@2.7.16/vue.js"></script>
    <script>
        //禁止控制台输出日志信息
        Vue.config.productionTip = false;
        new Vue({
            //挂载容器
            el: "#app",
            // 数据
            data(){
                return {
                    isShow: true 
                }
            },
        })
    </script>
</body>

</html>

2.使用动画库 

使用别人设置好的动画可以轻松实现好看的动画效果。

动画库:https://animate.style/

<!DOCTYPE html>
<html lang="zh-cn">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Vue</title>
    <!-- 动画库 -->
    <link rel="stylesheet" href="./libs/animate.min.css">

</head>

<body>
    <div id="app">
        <div class="container mt-2">
            <div class="btn btn-success" @click="isShow=true">入场(显示)</div>
            <div class="btn btn-danger" @click="isShow=false">离场(隐藏)</div>

            <!-- 2) 使用动画库 -->
            <transition
                enter-active-class="animate__animated  animate__backInLeft"
                leave-active-class="animate__animated  animate__fadeOutUp"
                >
                <div v-if="isShow" class="bg-warning mt-2" style="height: 200px;"></div>
            </transition>
        </div>
        

    </div>
    <script src="./libs/vue@2.7.16/vue.js"></script>
    <script>
        //禁止控制台输出日志信息
        Vue.config.productionTip = false;
        new Vue({
            //挂载容器
            el: "#app",
            // 数据
            data(){
                return {
                    isShow: true 
                }
            },
        })
    </script>
</body>

</html>

 文章来源地址https://www.toymoban.com/news/detail-848905.html

 

到了这里,关于前端小白的学习之路(Vue2 四)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 前端学习---vue2--指令修饰符详解

    写在前面: 前端感觉系统学起来还行,我也不晓得我是咋快速入门1个月就开始看实习公司代码的。然后现在开始系统复习,然后感觉有的封装的还可以,不过就是我不晓得,像这个指令修饰符,其实说逻辑难写,倒是也没有,就是简单不用自己写. 就像后端判断字符串是否为

    2024年02月14日
    浏览(33)
  • Vue.js 3 项目开发:迈向现代化前端开发的必经之路

    随着前端技术的不断发展,Vue.js作为一种轻量级的JavaScript框架,已经逐渐成为了前端开发者的首选。Vue.js 3有哪些新特性、优势以及如何高效地进行项目开发呢? Vue.js是一种用于构建用户界面的渐进式框架。它的核心库专注于视图层,易于与其他库或现有项目集成。Vue.js 3是

    2024年01月23日
    浏览(53)
  • 持续不断更新中... 自己整理的一些前端知识点以及前端面试题,包括vue2,vue3,js,ts,css,微信小程序等

    答: 在普通的前端项目工程中,在script标签中增加setup即可使用api 使用setup()钩子函数 答: 不要在计算属性中进行异步请求或者更改DOM 不要直接修改computed的值 区别: 计算属性值基于其响应式依赖被缓存,意思就是只要他之前的依赖不发生变化,那么调用他只会返回之前缓

    2024年02月11日
    浏览(63)
  • 前端学习---vue2--选项/数据--data-computed-watch-methods-props

    写在前面: vue提供了很多数据相关的。 简单的说就是进行双向绑定的区域。 vue实例的数据对象,会把data的数据转换成getter和setter,从而可以进行响应式的变化, vue实例创建后,可以通过vm.$data.x获取data里面的x,但同时vue实例也代理了其中的对象,所以我们一般使用简单的

    2024年02月14日
    浏览(41)
  • 前端小白的学习之路(CSS3 三)

    提示:过渡属性transition,动画属性animation,转化属性transform,裁剪属性clip-path,倒影属性box-reflect,模糊度属性filter  目录 一、transition  二、animation  三、transform  四、clip-path   五、box-reflect  六、filter  过渡:以看见标签从一个属性变化到另一个属性值的过程。 transition-pro

    2024年03月19日
    浏览(43)
  • 前端小白的学习之路(ES6 一)

    提示:声明:let与const,长度单位:em与rem,vw与wh,解构赋值,箭头函数(简介) 目录 一、ES6介绍 二、letconst 1.let 1) 用 let 声明的变量不能提前引用 2) 不允许重复声明变量 3) 可以产生块级作用域 { }   总结 2.const 三、 长度单位 1.em与rem 1).em 2).rem 2.vw与vh 四、 解构赋

    2024年04月15日
    浏览(49)
  • 【前端vue面试】vue2

    computed 有缓存,基于响应式依赖数据(基于data中声明过或者父组件传递的props中的数据)发生改变,才会重新进行计算 数据变,直接会触发相应的操作 watch监听引用类型,需要添加deep:true深度监听,拿不到oldVal(旧值),因为新值和老值指针相同。 v-show 和v-if 都是做条件隐

    2024年02月08日
    浏览(39)
  • Vue2简单使用及相关基础知识概念(适合小白入门,看完就能上手)

    MVC模式(同步通信为主):Model、View、Controller MVP模式(异步通信为主):Model、View、Presenter MVVM模式(异步通信为主):Model、View、ViewModel(目前主要的模式) 2.1 概念 MVVM是一种软件架构设计模式。MVVM的核心是ViewModel层,负责转换Model层中的数据对象来让数据变得更加容易

    2024年02月07日
    浏览(65)
  • Vue2 系列:vue.config.js 参数配置

    1. publicPath 默认值:\\\'/\\\' 说明:部署应用包时的基本 URL,例:https://www.my-app.com/my-app/,则设置 publicPath 为 /my-app/ 提示:1. 当使用基于 HTML5 history.pushState 的路由时 2.当使用 pages 选项构建多页面应用时。 2. outputDir 默认值:\\\'dist\\\' 说明:打包目录。 提示:目标目录在构建之前会被

    2024年02月11日
    浏览(51)
  • 【前端框架】Vue2合集

    1、Vue概念 vue 是一个用于构建用户界面的渐进式框架,由数据驱动 vue 的两种使用方式 vue 核心包开发:局部模块改造 vue 核心包与 vue 插件 工程化开发:整站 开发 2、 创建实例 1、准备容器 2、导包 3、创建Vue实例 4、指定配置项 = 渲染数据 3、插值表达式 插值表达式语法:

    2024年01月19日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包