前端框架学习之Vue 2,面试阿里P7岗

60 阅读5分钟

前端面试题汇总

JavaScript

性能

linux

前端资料汇总

开源分享:docs.qq.com/doc/DSmRnRG…

·尽可能多的重用代码
·自定义组件不容易(html css js)
·多次使用组件容易导致冲突

web components通过创建封装好功能的定制元素解决以上问题
但是还未被浏览器广泛接受
Vue实现了上述部分规范

2.组件注册

语法:

Vue.component('组件名称',{
	data:组件数据,
	template:组件模板内容
})

例子

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<script src="https://unpkg.com/vue/dist/vue.js"></script>
	</head>
	<body>
		<div id="app">
			<button-counter></button-counter>
			<button-counter></button-counter>
			<button-counter></button-counter>
		</div>
		<script>
			Vue.component('button-counter',{
				data:function(){
					return{
						count:0
					}
				},
				template:'<button @click="autoIncrement">点击了{{count}}次</button>',
				methods:{
					autoIncrement:function(){
						this.count++;
					}
				} 
			})
			var vm = new Vue({
				el: '#app',
				data: {}
			});
		</script>
	</body>
</html>


组件注册注意事项:

1.data必须是一个函数。实例vue实例时data却是一个对象。
2.组件模板内容必须是单个的根元素
3.组件模板内容可以是模板字符串,模板字符串需要浏览器提供支持(ES6语法)
template的值用反引号括起来

组件的命名方式:

短横线方式
button-counter
驼峰式方式
HelloWord
如果使用驼峰式命名组件时,那么在使用组件时,只能在字符串模板中使用驼峰的方式使用组件,但是在普通的标签模板中,必须转换为短横线的方式进行组件使用。
字符串模板中使用:
template:'<div><button @click="autoIncrement">点击了{{count}}次</button><HelloWord></HelloWord</div>'
普通的标签模板中使用时:
<div>
	<hello-word></hello-word>
</div>
转换规则为大写变小写,拼接时用短横线-

局部组件注册:

			var HelloOpener={
				data:function(){
					return{
						msg:'HelloOpener'
					}
				},
				template:'<div>{{msg}}</div>'
			};
			var HelloCustomer={
				data:function(){
					return{
						msg:'HelloCustomer'
					}
				},
				template:'<div>{{msg}}</div>'
			};
			var vm = new Vue({
				el: '#app',
				data: {},
				components:{
					'hello-opener':HelloOpener,
					'hello-customer':HelloCustomer
				}
			});
局部组件只能在注册它的父组件当中使用,在别的地方是不能使用的。
局部组件可包含全局组件。

3.Vue调试工具安装
1.克隆仓库
	打开命令行窗口,cd至你想要存放的目录。然后执行
	git clone https://github.com/vuejs/vue-devtools.git
2.安装依赖包
	npm install yarn -g
	cd vue-devtools 进入克隆下来的仓库
	yarn install 安装依赖包
3.构建 
	yarn run build
4.打开扩展页面加载构建包
	然后按照网上各种教程更改错误

结论安装失败或者扩展成功了但是不能正常使用。

所以:查看[这位大佬的博客]( ),下载了一个现成的扩展程序来扩展就好了
如果该文章中的下载链接已经失效的话,可以留言。

扩展程序成功加载时,在运行Vue项目时,打开控制台会出现如下图所示的页面。
在这里插入图片描述
可以通过vue的开发工具查看我们的标签结构和动态修改样式等。

4.组件之间的数据交互
父组件传递给子组件
子组件传递给父组件
兄弟组件互相传值

父组件向子组件传值
组件内部通过props接收传递过来的值
props 可以是数组或对象,用于接收来自父组件的数据。props 可以是简单的数组,或者使用对象作为替代,对象允许配置高级选项,如类型检测、自定义验证和设置默认值。

	// 简单语法
Vue.component('props-demo-simple', {
  props: ['size', 'myMessage']
})

// 对象语法,提供验证
Vue.component('props-demo-advanced', {
  props: {
    // 检测类型
    height: Number,
    // 检测类型 + 其他验证
    age: {
      type: Number,
      default: 0,
      required: true,
      validator: function (value) {
        return value >= 0
      }
    }
  }
})

使用:

<div size="100" age="18">
	<props-demo-simple size="size"></props-demo-simple>
	<props-demo-advanced :age="age"></props-demo-advanced>
</div>

动态绑定的数据需要在父组件中声明。


props属性命名规则

·在props中使用驼峰形式,模板中需要使用短横线的形式
·字符串形式的模板中没有这个限制
Vue.component('props-demo-simple', {
  props: ['size', 'myMessage'],
  template:'<div>{{myMessage}}</div>'
})

//字符串模板中可以使用驼峰式命名形式
template:'<props-demo-simple myMessage="template hello word" ></props-demo-simple>'

<!-- 在html中以短横线拼接形式使用 -->
<props-demo-simple my-message="hello word"></props-demo-simple>

props属性值类型

string  字符串
number   数值类型 使用时需要v-bind传递才能得到正确的类型,否则为string
boolean  布尔类型 使用时需要v-bind传递才能得到正确的类型,否则为string
arr  数组类型
object  对象类型

props传递数据为单项数据流,不允许子组件反向传递。

子组件向父组件传递信息
子组件通过自定义事件向父组件传递信息

Vue.component('props-demo-simple', {
  props: ['size', 'myMessage'],
  data:{
	fontSize:10	
},
  template:'<div>{{myMessage}}
				<button @click="$emit(enlarge-text)"></button>
			</div>'
})
<props-demo-simple @enlarge-text="fontSize+=10"></props-demo-simple>

子组件通过$emit提交一个自定义事件,父组件监听这个自定义事件。

传参:
<button @click="$emit('enlarge-text',10)"></button>
<props-demo-simple @enlarge-text="fontSize+=$event"></props-demo-simple>
父组件使用$event接收子组件传递的值,$event$emit是固定的写法。

兄弟组件之间的数据交互
单独的事件中心管理组件间的通信
组件A=事件中心=组件B

var eventHbu=new Vue()

监听事件与销毁事件

eventHub.$on('add-todo',addTodo)
eventHub.$off('add-todo')

触发事件

eventHub.$emit('add-todo',id)

例子

var eventHbu=new Vue()

Vue.component('comp-a', {
  data:{
	fontSize:10	
},
	template:'<button @click="">{{fontSize}}</button>',
	methods:{
		handle:function(){
			eventHub.$emit('b-event','str of a')
			}
	},
	mounted:{
		eventHub.$on('a-event'),(val)=>{
		this.fontSize+=val;
		}
	}
})
Vue.component('comp-b', {
  data:{
	fontSize:10	
},
	template:'<button @click="handle">{{fontSize}}</button>',
	methods:{
		handle:function(){
			eventHub.$emit('a-event','str of b')
			}
	},
	mounted:{
		eventHub.$on('b-event'),(val)=>{
		this.fontSize+=val;
		}
	}
})

<comp-b></comp-b>
<comp-a></comp-a>


组件插槽
父组件向子组件传递内容(模板内容)
slot为vue专用api



### React

*   介绍一下react

*   React单项数据流

*   react生命周期函数和react组件的生命周期

*   react和Vue的原理,区别,亮点,作用

*   reactJs的组件交流

*   有了解过react的虚拟DOM吗,虚拟DOM是怎么对比的呢

*   项目里用到了react,为什么要选择react,react有哪些好处

*   怎么获取真正的dom

*   选择react的原因

*   react的生命周期函数

*   setState之后的流程

*   react高阶组件知道吗?

*   React的jsx,函数式编程

*   react的组件是通过什么去判断是否刷新的

*   如何配置React-Router

*   路由的动态加载模块

*   Redux中间件是什么东西,接受几个参数

*   redux请求中间件如何处理并发

**[开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】](https://docs.qq.com/doc/DSmRnRGxvUkxTREhO)**

![](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/ecebcc4aae524bfa97df9ed772f8fbac~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771932625&x-signature=uCRT0vn7FrZUvkBgw5Pbmbd%2FDpE%3D)