Vue——全局组件、局部组件、组件的嵌套、单文件组件、组件的属性、v-slot: 插槽、css的作用域、面试题(组件基础)

目录

组件基础(面试)

1.全局组件:

2.局部组件:

 3.组件的嵌套:

4.单文件组件:

5.组件的属性

6.v-slot: 插槽

7.组件的自定义事件和原生事件

8.css的作用域

9.面试题(组件基础)

1 @ 是一个关键字,在引入的文件路径中 它代表src目录

2 template:组件的模板中只能有一个根节点

3 v-slot: 插槽, 具名插槽 slot,slot-scope过时了 2.6.0使用v-slot

4 组件的data为什么是个函数然后返回对象,以前使用vm时都是个对象

5 scoped:  style标签的scoped="scoped" 生成css的使用作用域只有当前组件内部的选择器生效

6 数据劫持的顺序

7 在使用计算属性的时候,函数名和 data 数据源中的数据可以 同名吗?

8、怎么跑起来的项目

9、如果el和$mount都写了,会不会冲突

10、Vue加载流程:

11、什么是DIFF

12、DIFF算法的过程 (了解)

13、下列对 Vue 原理的叙述,哪些是正确的?

14、对于 Vue 中响应式数据原理的说法,下列哪项是不正确的?

 15、 下列说法不正确的是哪项?

16、面试考点


组件基础(面试)

 组件一:

	<div id='app'>
		<Box></Box>
	</div>
	<script>
		var vm = new Vue({
			el: '#app',
			data: {},
			methods: {},
			components: {
				Box: {
					template: `<div>
					              <h1>6666</h1>
						           <p>hello</p>
					               </div>`
				}
			},
		})
	</script>

组件二:

<div id='app'>
			<Box></Box>
		</div>
		<script>
			let a1 = {
				template: `<div>
					              <h1>6666</h1>
						           <p>hello</p>
					               </div>`
			}
			var vm = new Vue({
				el: '#app',
				data: {},
				methods: {},
				components: {
					//注册组件
					Box: a1
				}
			})
		</script>

组件三:

	<div id='app'>
			<Box></Box>
		</div>
		<script type="module">		
		   //1.导入
			import Box from "./componnets/Box.js"
			var vm = new Vue({
				el: '#app',
				data: {},
				methods: {},
				components: {
					Box
				}
			})
		</script>

组件四:

<div id='app'>
			<Box></Box>
			<Box2></Box2>
		</div>
		<script type="module">		
		   //1.导入
			import Box from "./componnets/Box.js"
			var vm = new Vue({
				el: '#app',
				data: {},
				methods: {},
				components: {
					//2.注册组件
					Box,
					Box2:{
						template:`<div>
						       <h1>666-box2</h1>
							   <p @click="fn">{
  {msg}}</p>
						 </div>`,
						data:function(){
							return {msg:"msg66666"}
						},
						methods:{
							fn(){console.log("Box2组件的方法")}
						},
						filters: {},
						watch: {},
						computed: {},
						directives: {},
						beforeCreate() {},
					}
				},
				filters: {},
				watch: {},
				computed: {},
				directives: {},
				beforeCreate() {},
			})
		</script>

1.全局组件:

全局:所有组件共同的功能(指令,过滤器,组件)

组件的属性不能用大写字母

注册组件时,组件名不要用系统已经使用过的,组件template模板中,只能有一个根元素
组件的名字可以用驼峰命名法,但是使用的时候必须用连字符
全局注册的组件使用时不能使用单标签(不会报错,但是只能使用一次 多次使用只显示第一个)

注册的组件不要跟系统标签同名


2.局部组件:

局部:只有当前组件的功能(指令,过滤器,组件)

一个vm(根组件)实例可以有多个局部组件,但是只能供当前vm实例使用

 3.组件的嵌套:

.vue文件既可以是一个页面,也可以是一个组件
它可以被别人.vue文件引入 然后作为组件使用

	<style type="text/css">
			.app {
				width: 400px;
				height: 900px;
				background-color: gold;
			}
			.box1 {
				width: 200px;
				height: 200px;
				background-color: darkorange;
				margin: 20px;
			}
			.box11{
				width: 100px;
				height: 50px;
				background-color: hotpink;
				margin: 20px;
			}
		</style>
		<div id='app' class="app">
			<Box1></Box1>
			<Box1></Box1>
			<Box2></Box2>
			<p>{
  {msg|box1tool}}</p>
			<p v-color2="'blue'" v-color>{
  {msg|alltool1}}</p>
			<allbox></allbox>
		</div>
		<script>
			// 全局:所有组件共同的功能(指令,过滤器,组件) 
			// 局部:只有当前组件的功能(指令,过滤器,组件)
			Vue.filter("alltool1",function(str){
				return str+"-alltool1"
			})
			Vue.filter("alltool2",function(str){  //注册过滤器
				return str+"-alltool1"
			})
			Vue.directive("color",function(el,obj){  //注册全局自定义指令
				el.style.color=obj.value||"red"
			})
			Vue.component("allbox",{
				template:"<div>6666allbox</div>"			
			})
			var vm = new Vue({
				el: '#app',
				data: {
					msg:"appdata"
				},
				methods: {},
				components: {
					Box1: {  // 不能访问上面的data
						template: `<div class="box1">
						 <p>{
  {msg|box1tool}}</p>
						  <p v-color2="'blue'" v-color>{
  {msg|alltool1}}</p>
						  <Box11></Box11>
						  <allbox/>	
						 </div>`,
						data: function() {
							return {
								msg: "hello"
							}
						},
						methods: {},
						filters: {
							box1tool(str) {
								return str + "box1-filter"
							}
						},
						directives:{
							color2:{
								inserted(el,obj){
									el.style.background=obj.value||"red"
								}
							}
						},
						components:{
							Box11:{   //组件的嵌套
								template:`<div class="box11">
								         <h1>box11</h1>
								 </div>`
								 
							}
						}
					},
					Box2:{
						template:`<div>
						        <h1>{
  {msg|box1tool}}</h1>
								 <h1>{
  {msg|alltool1}}</h1>
						</div>`,
						data:function(){
							return {
								msg:"box2data"
							}
						}
					}
				}
			})
		</script>

4.单文件组件:

vue create init ==>下载后启动,就会自己生成vue页面

引入:@1官方脚手架 @2挂载vm对象 @3组件引入并渲染到vm中

单文件组件也有全局组件和局部组件
只是把一个组件单独写在一个.vue文件中,供别的组件引入然后注册
引入文件时:一般使用相对路径  上一下用../  同级使用./   下级使用/   @ 代表src文件夹

注册的组件名不能跟Vue中的和原生DOM的重名,注册的名字是驼峰,使用时就用连字符

注册的组件,使用时可以用双标签也可以用单标签:如果有插槽必须使用双标签

如果.Vue的script注释了,在打包的时候Vue的打包环境,会帮我们把这个文件解析为一个对象,然后给这个对象添加一个template属性,值为解析的<template>页面模板

==>所以.Vue文件中可以没有script,style标签,但是不能没有template(注册组件的时候有就可以了,没有导出语法,加载器 脚手架会去创建对象)

(至少有一个模板或者render函数)

不写script标签==>称为静态组件

 每一个组件内部只能有一个根元素,不要在根元素上写v-for

style标签可以写多个,也可以不写 

 在项目下创建vue.config.js 就是vue的打包配置文件:

const { defineConfig } = require('@vue/cli-service')

module.exports = defineConfig({

  transpileDependencies: true,

  lintOnSave:false//关闭eslint的严格模式检测

})

<div id="app">
			<nav1 son-proprety="子组件使用时属性传进去的值"></nav1>	
			<content1 img2src="./img/2.png"></content1>
		</div>
		
		<div id="app2">
			<nav1 son-proprety="子组件使用时属性传进去的值2"></nav1>
			<content1 img2src="./img/2.png"></content1>	
		</div>
		<script type="text/javascript">
		   //祖册全局组件
			Vue.component("nav1",{
				data(){return {sondata:"子组件的数据"}},
				template:`<div><h1>{
  {sondata}}</h1><p>{
  {sonProprety}}</p></div>`,
				props:["sonProprety"]
			})
			
			
			// let content1={
			// 			data(){return {img1:"./img/1.png"}},
			// 			template:`<div><img :src="img1"/><img :src="img2src"/></div>`,
			// 			props:["img2src"]
			// 		}
			
			
			new Vue({
				el:"#app",
				data:{},
				components:{
					// content1
					//注册局部组件
					content1:{
								data(){return {img1:"./img/1.png"}},
								template:`<div><img :src="img1"/><img :src="img2src"/></div>`,
								props:["img2src"]
							}
				}
			})
			new Vue({
				el:"#app2",
				data:{}				
			})
		</script>

组件一:

index.html

<style type="text/css">
			.nav1{
				width: 100%;
				height: 40px;
				background-color: gainsboro;
				display: flex;
				justify-content: flex-start;
				flex-wrap: nowrap;
			}
			.nav1 div{
				margin-left: 20px;
				l
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值