Vue CLI ref props mixin plugin scoped

news2024/11/25 22:34:43

3.2. ref 属性

ref被用来给元素或子组件注册引用信息(id的替代者

  • 应用在html标签上获取的是真实DOM元素,应用在组件标签上获取的是组件实例对象vc
  • 使用方式
    • 打标识:

    • 获取:this.$refs.xxx
<template> 
    <div>
        <h1 v-text="msg" ref="title"></h1>
        <button ref="btn" @click="showDOM">点我输出上方的DOM元素</button>
        <School ref="sch"/>
        <Student/>
    </div> 
</template> 

<script> 
    // 引入组件
    import School from './components/School.vue';
    import Student from './components/Student.vue';

    export default { 
        name:'App', 
        components:{ 
            School,
            Student 
        },
        data() {
            return {
                msg:'欢迎学习Vue!'
            }
        },
        methods: {
            showDOM(){
                console.log(this.$refs.title); // 真实DOM元素
                console.log(this.$refs.btn);  // 真实DOM元素
                console.log(this.$refs.sch);  // School组件的实例对象(vc)
            }
        }
    }
</script>  

输出如下所示:

在这里插入图片描述

3.3. props 配置项

props让组件接收外部传过来的数据

  • 传递数据**<Demo name=“xxx” :age=“18”/>**这里age前加:,通过v-bind使得里面的18是数字
  • 接收数据
    • 第一种方式(只接收)props:[‘name’, ‘age’]
    • 第二种方式(限制类型)props:{name:String, age:Number}
    • 第三种方式(限制类型、限制必要性、指定默认值)
      props:{
          name: {
              type:String,    // 类型
              required:true,  // 必要性
              default:'老王'  //默认值
          }
      }
      

备注props是只读的,Vue底层会监测你对props的修改,如果进行了修改,就会发出警告,若业务需求确实需要修改,那么请复制props的内容到data中,然后去修改data中的数据

src/App.vue

<template> 
    <div>
        <Student name="李四" sex="" :age="18"/>
        <Student name="王五" sex="" :age="18"/>
    </div> 
</template> 

<script> 
    // 引入组件
    import Student from './components/Student.vue';

    export default { 
        name:'App', 
        components:{ 
            Student 
        }
    }
</script>  

src/components/Student.vue

<template>
    <div>
        <h1>{{ msg }}</h1>
        <h2>学生姓名:{{name}}</h2>
        <h2>学生性别:{{sex}}</h2>
        <h2>学生年龄:{{myAge + 1}}</h2>
        <button @click="updateAge">尝试修改收到的年龄</button>
    </div>
</template>

<script>
    export default {
        name:'Student',
        data() {
            return {
                msg: "我是一个莆田学院的学生",
                myAge: this.age
            }
        },
        methods: { 
            updateAge() { 
                this.myAge++; 
            }
        },
        // 简单声明接收
        // props:['name','age','sex']

        // 接收的同时对数据进行类型限制
        // props: {
        //     name: String,
        //     age: Number,
        //     sex: String
        // }
        
        // 接收的同时对数据:进行类型限制+默认值的指定+必要性的限制
        props: {
            name: {
                type: String,   // name的类型是字符串
                required: true  // name是必要的
            },
            age: {
                type: Number,
                default: 99,    // 默认值
            },
            sex: {
                type: String,
                required: true
            }
        }
    }
</script>

输出如下所示:

在这里插入图片描述

3.4. mixin 混入

  1. 功能:可以把多个组件共用的配置提取成一个混入对象
  2. 使用方式
    1. 定义混入
      const mixin = { 
        data() {....}, 
        methods: {....} 
        .... 
      }
      
    2. 使用混入
      1. 全局混入Vue.mixin(xxx)
      2. 局部混入mixins:[‘xxx’]

备注

  1. 组件和混入对象含有同名选项时,这些选项将以恰当的方式进行“合并”,在发生冲突时以组件优先
  2. 同名生命周期钩子将合并为一个数组,因此都将被调用。另外,混入对象的钩子将在组件自身钩子之前调用

src/mixin.js

export const hunhe = { 
    methods: { 
        showName() { 
            alert(this.name); 
        }
    }, 
    mounted() {
        console.log('你好啊!'); 
    }
} 

export const hunhe2 = {
    data() { 
        return { 
            x:100, 
            y:200 
        } 
    }
}

src/components/School.vue

<template>
    <div>
        <h2 @click="showName">学校名称:{{name}}</h2>
        <h2>学校地址:{{address}}</h2>
    </div>
</template>

<script>
    // 引入一个hunhe 
    import {hunhe,hunhe2} from '../mixin';
    export default {
        name:'School',
        data() {
            return {
                name: "莆田学院",
                address: '北京'
            }
        },
        mixins:[hunhe,hunhe2] // 局部混入
    }
</script>

src/components/Student.vue

<template>
    <div>
        <h2 @click="showName">学生姓名:{{name}}</h2>
        <h2>学生性别:{{sex}}</h2>
    </div>
</template>

<script>
    import {hunhe,hunhe2} from '../mixin';
    
    export default {
        name:'Student',
        data() {
            return {
                name: "liqb",
                sex: '男'
            }
        },
        mixins:[hunhe,hunhe2] // 局部混入
    }
</script>

src/App.vue

<template> 
    <div>
        <School/>
        <hr/>
        <Student/>
    </div> 
</template> 

<script> 
    // 引入组件
    import Student from './components/Student.vue';
    import School from './components/School.vue';

    export default { 
        name:'App', 
        components:{ 
            Student,
            School
        }
    }
</script>  

src/main.js

import Vue from 'vue';
import App from './App.vue';

// import {mixin} from './mixin'

Vue.config.productionTip = false;
// Vue.mixin(hunhe) // 全局混合引入 
// Vue.mixin(hunhe2) // 全局混合

new Vue({
  el: '#app',
  render: h => h(App),
})

输出如下所示:

在这里插入图片描述

3.5. plugin 插件

  1. 功能:用于增强Vue
  2. 本质:包含install方法的一个对象,install的第一个参数是Vue,第二个以后的参数是插件使用者传递的数据
  3. 定义插件(见下 src/plugin.js)
  4. 使用插件:Vue.use()

src/plugin.js

export default {
    install(Vue,x,y,z){
        console.log(x,y,z);
        
        // 全局过滤器
        Vue.filter('mySlice', function(value) {
            return value.slice(0,3);
        });

        // 定义全局指令
        Vue.directive('fbind',{
            // 指令与元素成功绑定时(一上来)
            bind(element,binding){
                element.value = binding.value;
            },

            // 指令所在元素被插入页面时
            inserted(element,binding) {
                element.focus();
            },

            // 指令所在的模板被重新解析时
            update(element,binding) {
                element.value = binding.value;
            }
        });

        // 定义混入
        Vue.mixin({
            data() {
                return {
                    x:100,
                    y:200
                }
            }
        });

        // 给Vue原型上添加一个方法(vm和vc就都能用了)
        Vue.prototype.hello = ()=> {
            alert('你好啊');
        }
    }
}

src/main.js

import Vue from 'vue';
import App from './App.vue';
import plugins from './plugins'; // 引入插件

Vue.config.productionTip = false;
Vue.use(plugins,1,2,3); // 应用(使用)插件

new Vue({
  el: '#app',
  render: h => h(App),
})

src/components/School.vue

<template>
    <div>
        <h2>学校地址:{{address}}</h2>
        <h2>学校名称:{{name}}</h2>
        <button @click="test">点我测试一个hello方法</button>
    </div>
</template>

<script>
    export default {
        name:'School',
        data() {
            return {
                name: "莆田学院",
                address: '福建莆田'
            }
        },
        methods: {
            test(){
                this.hello();
            }
        }
    }
</script>

src/components/Student.vue

<template>
    <div>
        <h2>学生姓名:{{ name | mySlice}}</h2>
        <h2>学生性别:{{ sex }}</h2>
        <input type="text" v-fbind:value="name">
    </div>
</template>

<script>
    export default {
        name:'Student',
        data() {
            return {
                name: "liqb",
                sex: '男'
            }
        }
    }
</script>

输出如下所示:

在这里插入图片描述


3.6. scoped样式

  1. 作用:让样式在局部生效,防止冲突
  2. 写法:<style scoped>

Vue中的webpack并没有安装最新版,导致有些插件也不能默认安装最新版,如 npm i less-loader@7,而不是最新版

src/components/School.vue

src/components/Student.vue<template>
    <div class="demo">
        <h2 class="title">学校地址:{{address}}</h2>
        <h2>学校名称:{{name}}</h2>
    </div>
</template>

<script>
    export default {
        name:'School',
        data() {
            return {
                name: "莆田学院",
                address: '福建莆田'
            }
        }
    }
</script>

<style scoped> 
    .demo{ 
        background-color: skyblue; 
    } 
</style>

src/components/Student.vue

<template>
    <div class="demo">
        <h2 class="title">学生姓名:{{ name }}</h2>
        <h2 class="atguigu">学生性别:{{ sex }}</h2>
    </div>
</template>

<script>
    export default {
        name:'Student',
        data() {
            return {
                name: "liqb",
                sex: '男'
            }
        }
    }
</script>

<style lang="less" scoped> 
    .demo { 
        background-color: pink; 
        .atguigu { 
            font-size: 40px; 
        } 
    } 
</style>

src/App.vue

<template> 
    <div>
        <h1 class="title">你好啊</h1>
        <School/>
        <Student/>
    </div> 
</template> 

<script> 
    // 引入组件
    import Student from './components/Student.vue';
    import School from './components/School.vue';

    export default { 
        name:'App', 
        components:{ 
            Student,
            School
        }
    }
</script>

<style scoped> 
    .title { 
        color: red; 
    } 
</style>

输出如下所示:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/534389.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python依据某一文件夹中大量文件的名称复制另一文件夹中的同名文件

本文介绍基于Python语言&#xff0c;针对一个文件夹下大量的Excel表格文件&#xff0c;基于其中每一个文件的名称&#xff0c;从另一个文件夹中找到与这一文件夹中文件同名的文件&#xff0c;并将找到的同名文件复制到第三个文件夹中的方法。 首先&#xff0c;我们来明确一下本…

【网络】深入浅出了解网络世界

HTTP协议 TCP/IP协议族 我们通常使用的网络&#xff0c;是在TCP/IP协议族上运作的。而HTTP协议就是TCP/IP内部的一个子集。 计算机与网络设备之间的通讯需要一定的规则&#xff0c;这种规则就称为协议。 TCP/IP就是互联网上各种协议的总称。 分层管理 TCP/IP 按层次分为…

架构活动中评估需求的五个关注点

从架构活动的整体目标出发&#xff0c;确认需求存在的必要性。很多时候&#xff0c;尤其是大的项目&#xff0c;需求方经常会夹带私货。虽然他们并没有什么恶意&#xff0c;但是这些附加的需求不仅会消耗研发资源&#xff0c;还会增加项目复杂度和规划难度。而最坏的情况&#…

【王道·计算机网络】第四章 网络层【未完】

一、 概述和功能 1.1 网络层功能 主要任务&#xff1a;把分组从源端传到目的端&#xff0c;为分组交换网上的不同主机提供通信服务传输单位&#xff1a;数据报功能&#xff1a; 路由选择与分组转发&#xff0c;即选择最佳路径异构网络互联(依靠路由器)拥塞控制(所有结点都来不…

会议日程——2023第十二届中国PMO大会

2023第十二届中国PMO大会 主题&#xff1a;拥抱变革 展现PMO力量 主办方&#xff1a;PMO评论 签到与入场&#xff1a;人脸识别 时间&#xff1a;6月17-18日 地点&#xff1a;北京蓝调庄园 【邀 请 函】 企业要基业长青就必须持续保持组织活力。企业的内外部环境不会一成不…

Java --- redis实现分布式锁

目录 一、锁的种类 二、分布式锁具备的条件与刚需 三、springbootredisngnix单机实现案例 四、Nginx配置负载均衡 4.1、修改nginx配置文件 4.2、执行启动命令 4.3、启动微服务程序测试 五、使用redis分布式锁 5.1、方法递归重试 5.2、自旋方式 5.3、添加key过期时间&#xff0…

Vue3如何按需引入Element Plus以及定制主题色

1.首先使用指令进行安装 npm install element-plus --save 2.安装按需引入另外两个插件 npm install -D unplugin-vue-components unplugin-auto-import 3.在vite.config.js文件引入以下内容 import { fileURLToPath, URL } from node:urlimport { defineConfig } from vite i…

CloudFlare系列--自定义CDN节点的IP

原文网址&#xff1a;CloudFlare系列--自定义CDN节点的IP_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍CloudFlare如何手动指定CDN为CloudFlare的IP地址。 为什么手动指定CDN IP&#xff1f; 自选节点非常重要&#xff0c;原因如下&#xff1a; 国内访问不同CDN节点的速…

Linux vim光标移动/退出命令/撤退操作/文本查找 等命令大全

1 什么是vim&#xff1f; vim是Linux环境下一款强大、高度可定制的文本编辑工具。能够编辑任何的ASCII格式文件&#xff0c;对内容进行创建、查找、替换、修改、删除、复制、粘贴等操作。编写文件时&#xff0c;无需担心目标文件是否存在&#xff0c;若不存在则会自动在内存中…

老Q魔改MACD:拒绝大幅回撤,威力比原版强太多了!

看过老Q历史文章的股友都知道,MACD是一个非常经典且依旧奋战在第一线的顶流指标。我们之前也目前主流通用的参数版本在沪深300上做了回测,17年来获得了累计365%的收益。 然而,整个沪深300大盘在这17年里也涨了超过300%,也就是说,我们的策略也仅仅比拿着不动好上一丢丢而已…

JDK8中的新特性(Lambda、函数式接口、方法引用、Stream)

文章目录 1. Java8新特性&#xff1a;Lambda表达式1.1 关于Java8新特性简介1.2 冗余的匿名内部类1.3 Lambda 及其使用举例1.4 语法1.5 关于类型推断 2. Java8新特性&#xff1a;函数式(Functional)接口2.1 什么是函数式接口2.2 如何理解函数式接口2.3 举例2.4 Java 内置函数式接…

高压功率放大器在换流阀冷却系统均压电极结垢超声导波中的应用

实验名称&#xff1a;换流阀冷却系统均压电极结垢超声导波检测方法研究 研究方向&#xff1a;无损检测 测试目的&#xff1a; 为了探究超声导波检测的灵敏度&#xff0c;本文构建了换流阀冷却系统均压电极结垢检测模型&#xff0c;详细分析了不同厚度水垢与声波信号的交互过…

【c++】哈希---unordered容器+闭散列+开散列

1.unordered系列关联式容器 在C98中&#xff0c;STL提供了底层为红黑树结构的一系列关联式容器&#xff0c;在查询时效率可达到 logN&#xff0c;即最差情况下需要比较红黑树的高度次&#xff0c;当树中的节点非常多时&#xff0c;查询效率也不理想。最好的查询是&#xff0c;进…

FPGA开发基本流程详解

FPGA是一种可编程逻辑器件&#xff0c;与传统的硬连线电路不同&#xff0c;它具有高度的可编程性和灵活性。FPGA的设计方法包括硬件设计和软件设计两部分&#xff0c;硬件设计包括FPGA芯片电路、存储器、输入输出接口电路等等&#xff0c;软件设计则是HDL程序开发&#xff0c;以…

openCV 第四篇 角点检测、图像特征、图片拼接

本文原本打算直接简单介绍一下harris和sift&#xff0c;之后进行特征匹配&#xff0c;来一波图像拼接。 想来想去还是先介绍下原理吧&#xff0c;虽然没人看QAQ。可以直接点击右侧目录跳转到代码区。 本文可以完成&#xff1a; 角点检测 和 图像特征提取(就几行代码) 以及进…

Win32子窗口创建,子窗口回调函数,消息堆栈,逆向定位子窗口消息处理过程

本专栏上一篇文章中我们讲解了Win32程序入口识别&#xff0c;定位回调函数&#xff0c;具体事件处理的定位&#xff0c;这一章节中我们来讲解一下子窗口的创建&#xff0c;子窗口的回调函数&#xff0c;并且逆向分析子窗口消息处理过程。 文章目录 一.子窗口按钮的创建- 创建子…

charge pump的分析与应用

春节前最后一更&#xff0c;提前祝大家新春快乐&#xff0c;阖家安康&#xff0c;工作顺利&#xff01; 定义&#xff1a; 电荷泵是利用电容的充放电来实现电压的转换的&#xff0c;输入回路和输出回路轮流导通。通过调节占空比来调节输出电压。 它们能使输入电压升高或降低&…

基于PyQt5连接本地SQLite实现简单人力资源管理系统

人力资源管理系统 使用环境&#xff1a;Python3.86 PyQt5.15.4 sqlite3 记录一下最近学校举办的一个程序设计比赛&#xff0c;题目是实现一个简单的人力资源管理系统&#xff0c;文末有效果展示 我认为程序是面向人类而不是面向机器的&#xff0c;所以我使用了PyQt5封装了一…

SpringCloud源码分析 (Eureka-Server-处理客户端续约请求) (七)

文章目录 1.处理客户端续约请求1.1 InstanceResource.renewLease()1.2 InstanceRegistry.renew()1.3 PeerAwareInstanceRegistryImpl.renew()1.4 AbstractInstanceRegistry.renew()1.6 PeerAwareInstanceRegistryImpl.replicateToPeers()1.7 PeerEurekaNode.headbeat() 1.处理客…

大数据Doris(二十二):Rollup物化索引创建与操作

文章目录 Rollup物化索引创建与操作 一、创建测试表 二、创建Rollup物化索引表