【Vue 快速入门系列】ref、props、mixin、插件使用、样式混合解决方案合集

news2024/9/22 11:32:31

文章目录

    • 前言
    • 一、ref属性的使用
    • 二、props配置
    • 三、mixin混合语法
      • 1.简介
      • 2.使用方法
      • 3.注意点
      • 4.结合实例使用
        • ①全局混入
        • ②局部混入
    • 四、插件的使用
      • 1.插件语法
        • ①定义插件
        • ②引入插件并使用
      • 2.上手插件
    • 五、样式混合问题

前言


在前面介绍到了Vue的一些基本概念与如何使用Vue,并通过node中的npm 使用vue脚手架(vue-cli)搭建了一个简单的Vue应用,其实所有的Vue项目搭建的时候都是换汤不换药。今天将会介绍几个Vue中常用的配置,他们的大致功能如下:

  • ref 作用是将dom元素选择出来,对普通标签来说与document.getElementById(“xxx”)是一回事,对自定义组件来说会将Vue Componentd对象选择出来,获取到VC对象也就可以获取到其中的dom元素了。
  • props 作用是父组件向子组件传递数据(当父组件有更新的时候子组件也会有更新)
  • mixin 将组件公共部分提取出来,哪里用到就在哪里引用
  • 插件 别人写好的js文件,我们只需引入并use即可(这里要区分好组件与插件)
  • 样式混合 如果给组件的style不加scoped将会导致样式的混乱

有了大概的预览之后就可以进行深一步的学习了,将会配合一些代码实例进行叙述。

一、ref属性的使用

大家在学习css的时候学过各种选择器,也学过使用css选择器将dom元素选择出来,这个属性的话起到的作用就是将想要的dom元素选择出来,根据ref属性可以很轻松的找到dom元素。

  1. 被用来给元素或子组件注册引用信息(可以认为是id的替代者)
  2. 标记在html标签上可以获取真实DOM元素
  3. 标记在组件标签上可以获取组件实例对象(vc)
  4. 一句实例对象可以进行自己想要的操作
  5. 使用方式:
    1. 给元素打标识:
      ①. <h1 ref="xxx">.....</h1>
      ②. <School ref="xxx"></School>
      ③. <School :ref="xxx"></School>
    2. 获取元素:this.$refs.xxx

结合以下实例代码:
App.vue

<template>
<template>
  <div>
      <h2 ref="title">Hello World</h2>
      <Student ref="stu"></Student>
      <button @click="showInfo">点我体验ref</button>
  </div>
</template>

<script>
import Student from "./components/Student.vue"
export default {
    name:"App",
    components:{
        Student
    },
    methods:{
        showInfo(){
            // 打印这个vc对象中的模板中的ref有几个
            // {title: h2, stu: VueComponent}
            console.log(this.$refs)
            // 打印一下ref中的h2  title是什么样的
            // <h2>Hello World</h2>
            console.log(this.$refs.title)
            // 打印一下ref中的vc是什么样的
            // 直接将School组件对象实例打印了出来
            console.log(this.$refs.stu)
            //修改ref.title中的内容
            this.$refs.title.innerHTML="hehehe"
        }
    }
}
</script>

<style>

</style>

Student.vue

<template>
  <div class="demo">
      <h2 >我的名字是:{{name}}</h2>
      <h2>我的年龄是:{{age}}</h2>
      <img src="../assets/logo.png">

  </div>
</template>

<script>
export default {
    // eslint-disable-next-line vue/multi-word-component-names
    name:"Student",
    data(){
        return {
            name:"张三",
            age:18
        }
    }
}
</script>

<style>
.demo{
    background-color: rgb(173, 167, 167);
}
</style>

在这里插入图片描述
在这里插入图片描述

二、props配置

  1. 功能:让组件接收外部传过来的数据
  2. 传递数据:<Demo name="xxx"/>
  3. 接收数据:
    1. 第一种方式(只接收):props:['name']
    2. 第二种方式(限制类型):props:{name:String}
    3. 第三种方式(限制类型、限制必要性、指定默认值):
      props:{
      	name:{
      	type:String, //类型
      	required:true, //必要性
      	default:'老王' //默认值
      	}
      }
      

    注意:props是只读的,Vue底层会监测你对props的修改,如果进行了修改,就会发出警告,若业务需求确实需要修改,那么请复制(将数据复制到其他对象内)props的内容到data中一份,然后去修改data中的数据。props接收到的对象被替换掉会有waring 但是props对象内部的属性被替换掉编译器不会发现,但是我们一般不这么做。因为存在隐患。

当父组件中传给子组件的属性发生改变时,会触发模板的重新解析,如图所示。改变的是父组件传过去的name,会引起子组件接受到的属性发生改变。
在这里插入图片描述
代码如下:

App.vue

<template>
  <div>
      <Student :name="name" ></Student>
      <button @click="alert">点我改变传过去的props</button>
  </div>
</template>

<script>
import Student from "./components/Student.vue"
export default {
    name:"App",
    components:{
        Student
    },
    data(){
        return{
            name:"张三"
        }
    },
    methods:{
        alert(){
            this.name="我改变了"
        }
    }
}
</script>

<style>

</style>

Student.vue

<template>
    <div class="demo">
        <h2>我的名字是:{{name}}</h2>        
        <h2>我的名字是:{{newAge}}岁了</h2>
        <button @click="showInfo">点击我进行年龄加1</button>        
    </div>
</template>

<script>
export default {
    // eslint-disable-next-line vue/multi-word-component-names
    name:"Student",
    data(){
        return {
            // 支持直接将props中传递过来的属性直接使用
            newAge:this.age
        }
    },
    // 第一种简单的绑定
        // 不加限定语句的传递
        // props:["name","age"],
    // 第二种带有类型限制的绑定
        /*
        props:{
            name:String,
            // age要么为Nuber要么将age改为限制为String类型
            // 要么在传进来的时候使用编程小技巧进行数据绑定传进来一个数值
            // :age="18"
            age:Number
        },
        */
    //第三种带有详细限制的props(可以设置类型、是否必须、默认值)
    props:{
        // 一般来说默认值与是否必须只选择一个即可,如果选必须,那么就不需要默认值
        // 如果选默认值,那么这个属性就不是必须要传过来的。
        "name":{
            type:String,
            required:true
        },
        "age":{
            type:Number,
            default:28
        }
    },
    methods:{
        showInfo(){
            this.newAge++
            // 以下语句报错
            // this.age++
        }
    }
}
</script>

<style>
.data{
    background-color: rgb(202, 190, 190);
}
</style>

三、mixin混合语法

1.简介

mixin可以大大的提升代码的利用率,把多个组件需要的功能提出到一个文件内
如果mixin限定在main.js上,那么这个程序所有组件都会有

2.使用方法

  1. 在mixin.js中定义要混合的代码,组件中引入,并显示调用mixin属性mixins:[]其中mixin后面跟的必须是一个数组
  2. 在main.js中开启全局配置

3.注意点

如果你的组件中定义了与mixin中相关的代码,脚手架会以你定义的代码为基础(也就是组件中定义的代码优先级大)
但是一些特殊函数例外,比如mounted挂载函数。声明周期函数会先执行混入代码再执行自定义的代码

4.结合实例使用

混入的生命周期函数会先执行,然后执行组件内定义的生命周期函数,普通函数是以组件内定义的为基础,如果组件内没有定义会以混入的函数为基础,如果两个地方都没定义就会抛出异常。
在这里插入图片描述

①全局混入

全局混入通常在main.js中进行定义,然后在所有的组件中均可以使用(不需要再定义属性mixin)
语法如下:
main.js

// 导入即将混合的代码
import {mixin1,mixin2} from "./mixin"
// 开启全局的混入(合)
Vue.mixin(mixin1)
Vue.mixin(mixin2)

②局部混入

局部混入的代码需要先进行mixin的引入,然后将其写进Vue Component对象的属性内也就是前面使用方法中介绍到的mixins:[xxx,xxxx]。
下面是App.vue中的一部分代码:

import {mixin1,mixin2} from "./mixin"
export default {
    name:"App",
    components:{
        Student,
        School
    },
    mixins:[mixin1,mixin2]
}

当然在体验局部混入跟全局混入的区别时,也可以通过以下一个实例:
当打开全局混入时,不必使用mixins,即使使用了mixins,普通函数会以你定义的代码为基础。
test.html

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue 测试实例 - 菜鸟教程(runoob.com)</title>
<script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js"></script>
</head>
<body>
<div id = "databinding"></div>
<script type = "text/javascript">
var mixin = {
	methods: {
		hellworld: function () {
			document.write('HelloWorld 方法' + '<br>');
		},
		samemethod: function () {
			document.write('Mixin:相同方法名' + '<br>');
		}
	}
};
//全局混入
Vue.mixin(mixin)
var vm = new Vue({
	//mixins: [mixin],
	methods: {
		start: function () {
			document.write('start 方法' + '<br>');
		},
		samemethod: function () {
			document.write('Main:相同方法名' + '<br>');
		}
	}
});
vm.hellworld();
vm.start();
vm.samemethod();
</script>
</body>
</html>

四、插件的使用

对vue的一种增强,包含一个install方法的对象,install方法第一个参数是vue,第二个以后的参数是使用者传递的参数

1.插件语法

①定义插件

```js
const plugins={
	// 这里install其实是一个属性
	install(vue,x,y,z){
		....
	}
}
export plugins
```

②引入插件并使用

import ... from ....
Vue.use(...,参数1,参数2....)

2.上手插件

自定义插件一般放在plugins目录下,网络上也有许多大牛定义的插件,只需引入使用即可;接下来带大家自定义一个插件,并导入Vue项目进行使用。

plugins.js

const plugins={
    install(Vue,x=0,y=0,z=0){
		console.log(x,y,z)
		//全局过滤器
		// 使用到这个过滤器的地方将会只显示列表中的前四个元素
		Vue.filter('mySlice',function(value){
			return value.slice(0,4)
		})

		//定义全局指令
		Vue.directive('fbind',{
			//指令与元素成功绑定时(一上来)
			bind(element,binding){
				element.value = binding.value
			},
			//指令所在元素被插入页面时
			inserted(element){
				element.focus()
			},
			//指令所在的模板被重新解析时
			update(element,binding){
				element.value = binding.value
			}
		})

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

		//给Vue原型上添加一个方法(vm和vc就都能用了)
		Vue.prototype.Hello = ()=>{alert('你好啊')}
	}
}
//暴露出去
export default plugins

引入并使用插件
main.js

import App from "./App.vue"
import Vue from "vue"
//导入插件
import plugins from "./plugins"
//注册插件
Vue.use(plugins)
new Vue({
    el:"#App",
    render:h=>h(App)
})

使用插件中的自定义指令

<template>
  <div>
      <h2>姓名:{{name}}</h2>
      <h2>年龄:{{age}}</h2>
      <input v-fbind:value="name">
  </div>
</template>

<script>
export default {
    // eslint-disable-next-line vue/multi-word-component-names
    name:"Student",
    data(){
        return {
            name:"张三",
            age:18
        }
    }
}
</script>

<style>

</style>

五、样式混合问题

描述:不同组件中如果使用相同的class,会导致出现样式覆盖的问题,覆盖规则是父组件覆盖子组件子组件根据导入顺序,新的覆盖旧的。可以使用不同的类名进行区分解决问题,也可以使用scoped属性,对style属性我们还可以使用lang进行指定,我们是用Less还是用css
原理:scoped会根据经纬度、时间、使用电脑型号等生成一个唯一id,然后将这个id插入到对应的标签内
再将相应的样式转换为标签属性选择器,进行样式语言的限定。默认选择css样式语言

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

至此这几种属性或者使用语法就介绍完了,大家有啥疑问或者好的想法欢迎评论区留言。

在这里插入图片描述

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

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

相关文章

ARM64(M1版)Mac运行MAA以及AzurLaneAutoScript自动化打明日方舟和碧蓝航线

前言 首先感谢Github上面MAA以及AzurLaneAutoScript的开发组&#xff0c;让我们有工具可用。 再感谢吕明珠LmeSzinc 和binss 大佬&#xff0c;他们的教程让我受益良多。 能看到这篇教程的&#xff0c;想必都拥有M1或者M2芯片的Mac电脑&#xff0c;因为新芯片不能安装双系统所…

RabbitMQ:安装配置

一般来说&#xff0c;安装分为两种方式&#xff1a;1. 下载 RabbitMQ 源文件&#xff0c;解压源文件之后进行安装。2. 通过 brew 命令安装。在这里&#xff0c;推荐使用 brew 来安装&#xff0c;非常强大的 Mac 端包管理工具。 ~ 本篇内容包括&#xff1a;Mac 安装 RabbitMQ、M…

SSM网上在线水果店商城超市网站平台

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 该项目为前后台项目&#xff0c;分为普通用户与管理员两种角色&#xff0c;前台普通用户登录&#xff0c;后台管理员登录&#xff1b; 管理员角…

【数电实验】组合逻辑电路

实验三 触发器及其应用 一 实验目的 1 了解触发器的触发方式&#xff08;上升沿触发、下降沿出发&#xff09;及其触发特点&#xff1b; 2 测试常用触发器的逻辑功能&#xff1b; 3 掌握用触发器设计同步时序逻辑电路的方法。 二 实验内容 1 测试双D触发器74HC74的逻辑功能…

cmu 445 poject 1笔记

文章目录cmu 445 poject 1笔记Extendible hashingLRU-KBufferPool Managercmu 445 poject 1笔记 2022年的任务 https://15445.courses.cs.cmu.edu/fall2022/project1/ extendible hashinglru-kbufferpool manger 本文不写代码&#xff0c;只记录遇到的一些思维盲点 Extendible …

SpringCloud02:微服务架构rest模拟环境搭建

微服务架构rest模拟环境搭建Rest环境搭建&#xff1a;服务提供者springcloud主模块pom.xmlspringcloud-api模块springcloud-provider-dept-8001服务提供模块配置相关Rest环境服务消费者Java编写Rest环境搭建&#xff1a;服务提供者 springcloud主模块pom.xml <?xml versi…

让我们看看xargs做了什么事情?

说到xargs,不得不提到 find 和 grep ,当然了少不了管道 | find 和 grep我经常会搞混掉这两个功能很相似的命令的用法,总是会记不太住怎么用,也借此文章加深一下记忆。 find ./xx/xx/ -name abc.v grep -r abc ./* // -r 表示整个目录查找 一般我们会使用find…

[附源码]计算机毕业设计基于Java酒店管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Python Open3D点云配准点对点,点对面ICP(Iterative Closest Point)

Python Open3D点云配准 ICP(Iterative Closest Point&#xff09; 这篇博客将介绍 迭代最近点配准算法(Iterative Closest Point, ICP) 。多年来&#xff0c;它一直是研究和工业中几何注册的支柱。输入是两个点云和一个初始变换&#xff0c;该变换大致将源点云与目标点云对齐。…

g++多文件编译

g windows 多文件编译 文章目录g windows 多文件编译Examplescenario 1scenario 2方法一 使用 先编译&#xff0c;再连接方法二 直接编译 生成结果文件visual code 配置 tasks.json问题 undefined reference to std::__cxx11::basic_string<char, std::charg编译单个文件时&…

Java基础:线程池

第一章 等待唤醒机制 1.1 线程间通信 概念&#xff1a;多个线程在处理同一个资源&#xff0c;但是处理的动作&#xff08;线程的任务&#xff09;却不相同。 比如&#xff1a;线程A用来生成包子的&#xff0c;线程B用来吃包子的&#xff0c;包子可以理解为同一资源&#xff…

【SpringMVC】入门篇:带你了解SpringMVC的执行流程

目录 一、简介 二、环境的搭建 三、快速入门 四、SpringMVC的执行流程 Spring有关的文章已经全部更新完&#xff0c;收录于我的专栏&#x1f449;Spring&#x1f448; 一、简介我们在前边已经学习了Spring的基本使用。从这节开始&#xff0c;我们进行SpringMVC的学习。在学习之…

汇编算数运算指令

目录 加法类指令 加法指令ADD 加进位的加法指令ADC 带进位有啥用呢&#xff1f; 增量指令INC&#xff08;1&#xff09; 减法类指令 减法指令SUB 带借位减法指令SBB 减量指令DEC 比较指令CMP&#xff08;分支程序设计常用&#xff09; 乘法指令 乘法指令MUL和符号整…

职场经验:自动化测试介绍和分类,看这一篇就够了

什么是自动化测试? 自动化测试是软件测试活动中一个重要的分支和组成部分,即利用工具或脚本达到测试目的,没有人工或者极少人工参与的软件测试活动称为自动化测试. 自动化测试的优势有哪些? 方便进行回归测试,当软件的版本发布比较频繁的时候,自动化的效果很明显 自动处理…

全网第三详细tshark使用帮助

一 前言tshark作为wireshark的命令行版本&#xff0c;功能非常强大&#xff0c;可以抓包&#xff0c;数据包分析、提取文件、提取分析后的数据还支持各种格式&#xff0c;可以说一把流量分析的瑞士军刀&#xff0c;如果在低流量的场景&#xff0c;包装下tshark命令&#xff0c;…

查找树莓派ip地址的几种方法

1.环境说明 从上面的图中可以看到树莓派是通过网线和win10电脑相连的&#xff0c;以此来共享win10电脑网络&#xff0c;但是需要在电脑端设置后才能将网络共享出来&#xff0c; 设置方法参考以下链接&#xff1a; 通过一根网线共享网络给另一个电脑或者群辉上网 注意&#xff0…

jQuery 遍历

什么是遍历&#xff1f; jQuery 遍历&#xff0c;意为"移动"&#xff0c;用于根据其相对于其他元素的关系来"查找"&#xff08;或选取&#xff09;HTML 元素。以某项选择开始&#xff0c;并沿着这个选择移动&#xff0c;直到抵达您期望的元素为止。 下图…

dotnet项目使用Cefsharp与Js互相调用函数

1. 背景 最近在一个项目中使用 CefSharp 加载H5页面, 其中一些业务逻辑需要调用 Js 函数, 同时 Js 也会调用一些 native 函数: 这里我们使用官方的demo代码进行添加修改, 修改后的代码在此: DevWiki/CefSharp.MinimalExample - CefSharp.MinimalExample - DevWiki Gitea 2. J…

Allegro如何打开和关闭飞线操作指导

Allegro如何打开和关闭飞线操作指导 Allegro可以打开和关闭飞线,下面介绍如何打开和关闭飞线,具体操作如下 选择display-show rats-all。打开所有nets的飞线 如下图 如果菜单里面添加图标,可以直接点击图标显示所有飞线 选择display-Blank Rats-all关闭所有nets的飞线 …

Spring MVC学习 | 简介HelloWord

文章目录一、Spring MVC简介1.1 MVC回顾1.2 Spring MVC是神魔二、HelloWord2.1 相关文件的准备2.2 创建请求控制器2.3 创建Spring MVC配置文件2.4 测试HelloWord2.4.1 访问首页2.4.2 访问目标页面2.5 执行流程学习视频&#x1f3a5;&#xff1a;https://www.bilibili.com/video…