2024年手把手教你进阶VUE,猴子都能看懂的教程_vue 教程进阶,字节跳动+阿里+华为+小米等10家大厂面试真题

算法

  1. 冒泡排序

  2. 选择排序

  3. 快速排序

  4. 二叉树查找: 最大值、最小值、固定值

  5. 二叉树遍历

  6. 二叉树的最大深度

  7. 给予链表中的任一节点,把它删除掉

  8. 链表倒叙

  9. 如何判断一个单链表有环

由于篇幅限制小编,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!

如果你觉得对你有帮助,可以戳这里获取:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

<head>
	<meta charset="UTF-8" />
	<title>基本使用</title>
	<script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
	<!-- 准备好一个容器-->
	<div id="root">
		<hello></hello>
		<hr>
		<h1>{{msg}}</h1>
		<hr>
		<!-- 第三步:编写组件标签 -->
		<school></school>
		<hr>
		<!-- 第三步:编写组件标签 -->
		<student></student>
	</div>

	<div id="root2">
		<hello></hello>
	</div>
</body>

<script type="text/javascript">

Vue.config.productionTip = false

//第一步:创建school组件
const school = Vue.extend({
template:`

学校名称:{{schoolName}}

学校地址:{{address}}

//第一步:创建student组件
const student = Vue.extend({
template:`

学生姓名:{{studentName}}

学生年龄:{{age}}

`, data(){ return { studentName:'张三', age:18 } } })

//全局组件
const hello=Vue.extend({
template:`

hello {{name}}

`, data(){ return { name:'Tom' } } });

Vue.component(‘hello’,hello);
//创建vm
new Vue({
el:‘#root’,
data:{
msg:‘你好啊!’
},
//第二步:注册组件(局部注册)
components:{
school,
student
}
})

new Vue({
el:‘#root2’,
})


##### 1.1.2 注意点



几个注意点:
1.关于组件名:
一个单词组成:
第一种写法(首字母小写):school
第二种写法(首字母大写):School
多个单词组成:
第一种写法(kebab-case命名):my-school
第二种写法(CamelCase命名):MySchool (需要Vue脚手架支持)
备注:
(1).组件名尽可能回避HTML中已有的元素名称,例如:h2、H2都不行。
(2).可以使用name配置项指定组件在开发者工具中呈现的名字。

				2.关于组件标签:
							第一种写法:<school></school>
							第二种写法:<school/>
							备注:不用使用脚手架时,<school/>会导致后续组件不能渲染。

				3.一个简写方式:
							const school = Vue.extend(options) 可简写为:const school = options
				4.组件的嵌套
							组件内部还有组件

##### 1.1.3 VueCompoent


![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/ce3602592695f4bdaf42ccf37831e4bc.png#pic_center)



关于VueComponent:
1.school组件本质是一个名为VueComponent的构造函数,且不是程序员定义的,是Vue.extend生成的。

					2.我们只需要写<school/>或<school></school>,Vue解析时会帮我们创建school组件的实例对象,
						即Vue帮我们执行的:new VueComponent(options)。

					3.特别注意:每次调用Vue.extend,返回的都是一个全新的VueComponent!!!!

					4.关于this指向:
							(1).组件配置中:
										data函数、methods中的函数、watch中的函数、computed中的函数 它们的this均是【VueComponent实例对象】。
							(2).new Vue(options)配置中:
										data函数、methods中的函数、watch中的函数、computed中的函数 它们的this均是【Vue实例对象】。

					5.VueComponent的实例对象,以后简称vc(也可称之为:组件实例对象)。
						Vue的实例对象,以后简称vm。
					6.
						1.一个重要的内置关系:VueComponent.prototype.__proto__ === Vue.prototype
						2.为什么要有这个关系:让组件实例对象(vc)可以访问到 Vue原型上的属性、方法。

#### 1.2 单文件组件(重要)


`概述`:结构、样式相分离,每一个组件就是一个小的功能,开发最常用,统一通过`App`组件调用


`School`



{{name}}

{{address}}


`Student`



{{name}}

{{age}}


`App`




### 二、脚手架


`概述`:`vue`提供的开发工具、快速部署开发环境,https://cli.vuejs.org/zh/


#### 2.1 基本使用


`概述`:这部分用到看官网教程就行(注意`vue`项目版本)



npm install -g @vue/cli
//注意版本的选择


在`vue.config.js`内部加入下面的代码,去除`语法检查`(重要)



lintOnSave: false,


#### 2.2 vue版本



  1. vue.js与vue.runtime.xxx.js的区别:
    1. vue.js是完整版的Vue,包含:核心功能 + 模板解析器。
    2. vue.runtime.xxx.js是运行版的Vue,只包含:核心功能;没有模板解析器(少了1/3)
  2. 因为vue.runtime.xxx.js没有模板解析器,所以不能使用template这个配置项,需要使用render函数接收到的createElement函数去指定具体内容。

#### 2.3 属性介绍


##### 2.3.1 基本结构



├── node_modules
├── public
│ ├── favicon.ico: 页签图标
│ └── index.html: 主页面
├── src
│ ├── assets: 存放静态资源
│ │ └── logo.png
│ │── component: 存放组件
│ │ └── HelloWorld.vue
│ │── App.vue: 汇总所有组件
│ │── main.js: 入口文件
├── .gitignore: git版本管制忽略的配置
├── babel.config.js: babel的配置文件
├── package.json: 应用包配置文件
├── README.md: 应用描述文件
├── package-lock.json:包版本控制文件


##### 2.3.2 props


* 被用来给元素或子组件注册引用信息(id的替代者)
* 应用在html标签上获取的是`真实DOM`元素,应用在组件标签上是组件实例对象(vc)
* 使用方式:
	+ 打标识:`<h1 ref="xxx">.....</h1>`或 `<School ref="xxx"></School>`
	+ 获取:`this.$refs.xxx`


##### 2.3.3 props


`概述`:让组件接收外部传过来的数据,可以实现`父组件=>子组件`数据通信


* 传递数据:`<Demo name="xxx"/>`
* 接收数据:


1. 第一种方式(只接收):`props:['name']`
2. 第二种方式(限制类型):`props:{name:String}`
3. 第三种方式(限制类型、限制必要性、指定默认值)

 

props:{
name:{
type:String, //类型
required:true, //必要性
default:‘老王’ //默认值
}
}




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


##### 2.3.4 mixin混入


`概述`:可以把多个组件共用的配置提取成一个混入对象


1. 使用方式:

 第一步定义混合:

 

{
data(){…},
methods:{…}

}

 第二步使用混入:

 ​ 全局混入:`Vue.mixin(xxx)`  
 ​ 局部混入:`mixins:['xxx']`


#### 2.4 插件


`概述`:用于增强Vue、扩展更多功能


1. 本质:包含install方法的一个对象,install的第一个参数是Vue,第二个以后的参数是插件使用者传递的数据。
2. 定义插件:

 

对象.install = function (Vue, options) {
// 1. 添加全局过滤器
Vue.filter(…)

// 2. 添加全局指令
Vue.directive(....)

// 3. 配置全局混入(合)
Vue.mixin(....)

// 4. 添加实例方法
Vue.prototype.$myMethod = function () {...}
Vue.prototype.$myProperty = xxxx

}

3. 使用插件:`Vue.use()`


#### 2.5 scoped样式


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


#### 2.6 配置代理


`概述`:引入`axios`插件(封装xml方法),通过**代理服务器**实现跨域通信


![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/d943035a6e1b23394a706001819db706.png#pic_center)


在`vue.config.js`内部加入下面的代码



module.exports = {
//去除语法检查
lintOnSave: false,

//配置代理服务器(第一种)
/* devServer: {
proxy: ‘http://localhost:5000’
} */

//配置代理服务器 (第二种)
devServer: {
proxy: {
‘/api1’: {
target: ‘http://localhost:5000’,
pathRewrite: { ‘^/api1’: ‘’ },
ws: true,
changeOrigin: true
},
‘/api2’: {
target: ‘http://localhost:5001’,
//正则匹配,去除这个字符串,再发送给5001服务器
pathRewrite: { ‘^/api2’: ‘’ },
ws: true,
changeOrigin: true
}
}
}
}




#### 2.7 TodoList案例


1. 组件化编码流程:

 ​ (1).拆分静态组件:组件要按照功能点拆分,命名不要与html元素冲突。

 ​ (2).实现动态组件:考虑好数据的存放位置,数据是一个组件在用,还是一些组件在用:

 ​ 1).一个组件在用:放在组件自身即可。

 ​ 2). 一些组件在用:放在他们共同的父组件上(状态提升)。

 ​ (3).实现交互:从绑定事件开始。
2. props适用于:

 ​ (1).父组件 ==> 子组件 通信

 ​ (2).子组件 ==> 父组件 通信(要求父先给子一个函数)
3. 使用v-model时要切记:v-model绑定的值不能是props传过来的值,因为props是不可以修改的!
4. props传过来的若是对象类型的值,修改对象中的属性时Vue不会报错,但不推荐这样做。


### 三、拓展


#### 3.1 组件的自定义事件


1. 一种组件间通信的方式,适用于:**子组件 ===> 父组件**,和`props`传入数据不一样,不需要`props`接收
2. 使用场景:A是父组件,B是子组件,B想给A传数据,**让B使用事件携带数据回到A**(事件的回调在A中)
3. 绑定自定义事件:


	1. 第一种方式,在父组件中:`<Demo @atguigu="test"/>`或 `<Demo v-on:atguigu="test"/>`
	2. 第二种方式,在父组件中:
	
	 
	```
	<Demo ref="demo"/>
	......
	mounted(){
	   this.$refs.xxx.$on('atguigu',this.test)
	}
	
	```
	3. 若想让自定义事件只能触发一次,可以使用`once`修饰符,或`$once`方法。
4. 触发自定义事件:`this.$emit('atguigu',数据)`
5. 解绑自定义事件`this.$off('atguigu')`
6. 组件上也可以绑定原生DOM事件,需要使用`native`修饰符。
7. 注意:通过`this.$refs.xxx.$on('atguigu',回调)`绑定自定义事件时,回调要么配置在methods中,要么用箭头函数,否则this指向会出问题!未配置在`methods`和`使用箭头函数的`,那个组件触发,`this`指向谁


#### 3.2 全局事件总线


![5](https://gitee.com/riskbaby/picgo/raw/master/blog/202210131059391.png)
`注意`:这里直接挂载到`Vue`原型对象身上,可以查看`1.1.3 VueCompoent`那张图


1. 一种组件间通信的方式,适用于任意组件间通信。
2. 安装全局事件总线:

 

new Vue({

beforeCreate() {
Vue.prototype. b u s = t h i s / / 安装全局事件总线, bus = this //安装全局事件总线, bus=this//安装全局事件总线,bus就是当前应用的vm
},

})

3. 使用事件总线:


	1. 接收数据:A组件想接收数据,则在A组件中给$bus绑定自定义事件,事件的回调留在A组件自身。
	
	 
	```
	methods(){
	  demo(data){......}
	}
	......
	mounted() {
	  this.$bus.$on('xxxx',this.demo)
	}
	
	```
	2. 提供数据:`this.$bus.$emit('xxxx',数据)`
4. 最好在beforeDestroy钩子中,用$off去解绑当前组件所用到的事件。


#### 3.3 消息订阅与发布(pubsub)


1. 一种组件间通信的方式,适用于任意组件间通信,和全局事件总线差不多,只不过把原型身上的`$bus`转移到组件中
2. 使用步骤:


	1. 安装pubsub:`npm i pubsub-js`
	2. 引入: `import pubsub from 'pubsub-js'`
	3. 接收数据:A组件想接收数据,则在A组件中订阅消息,订阅的回调留在A组件自身。
	
	 
	```
	methods(){
	  demo(data){......}
	}
	......
	mounted() {
	  this.pid = pubsub.subscribe('xxx',this.demo) //订阅消息
	}
	
	```
	4. 提供数据:`pubsub.publish('xxx',数据)`
	5. 最好在beforeDestroy钩子中,用`PubSub.unsubscribe(pid)`去取消订阅。


#### 3.4 插槽


1. 作用:让父组件可以向子组件指定位置插入html结构,也是一种组件间通信的方式,适用于 **父组件 ===> 子组件** 。
2. 分类:默认插槽、具名插槽、作用域插槽
3. 使用方式:


	1. 默认插槽:
	
	 
	```
	父组件中:
	        <Category>
	           <div>html结构1</div>
	        </Category>
	子组件中:
	        <template>
	            <div>
	               <!-- 定义插槽 -->
	               <slot>插槽默认内容...</slot>
	            </div>
	        </template>
	
	```
	2. 具名插槽:
	
	 
	```
	父组件中:
	        <Category>
	            <template slot="center">
	              <div>html结构1</div>
	            </template>
	
	            <template v-slot:footer>
	               <div>html结构2</div>
	            </template>
	        </Category>
	子组件中:
	        <template>
	            <div>
	               <!-- 定义插槽 -->
	               <slot name="center">插槽默认内容...</slot>
	               <slot name="footer">插槽默认内容...</slot>
	            </div>
	        </template>
	
	```
	3. 作用域插槽:
	
	
		1. 理解:数据在组件的自身,但根据数据生成的结构需要组件的使用者来决定。(games数据在Category组件中,但使用数据所遍历出来的结构由App组件决定)
		2. 具体编码:
		
		 
		```
		父组件中:
				<Category>
					<template scope="scopeData">
						<!-- 生成的是ul列表 -->
						<ul>
							<li v-for="g in scopeData.games" :key="g">{{g}}</li>
						</ul>
					</template>
				</Category>
		
				<Category>
					<template slot-scope="scopeData">
						<!-- 生成的是h4标题 -->
						<h4 v-for="g in scopeData.games" :key="g">{{g}}</h4>
					</template>
				</Category>
		子组件中:
		        <template>
		            <div>
		                <slot :games="games"></slot>
		            </div>
		        </template>
				
		        <script>
		            export default {
		                name:'Category',
		                props:['title'],
		                //数据在子组件自身
		                data() {
		                    return {
		                        games:['红色警戒','穿越火线','劲舞团','超级玛丽']
		                    }
		                },
		            }
		        </script>
		
		```


#### 3.5 nextTick


1. 语法:`this.$nextTick(回调函数)`
2. 作用:在下一次 DOM 更新结束后执行其指定的回调。
3. 什么时候用:当改变数据后,要基于更新后的新DOM进行某些操作时,要在nextTick所指定的回调函数中执行。


#### 3.6 本地存储


1. 存储内容大小一般支持5MB左右(不同浏览器可能还不一样)
2. 浏览器端通过 Window.sessionStorage 和 Window.localStorage 属性来实现本地存储机制。
3. 相关API:


	1. `xxxxxStorage.setItem('key', 'value');`  
	 该方法接受一个键和值作为参数,会把键值对添加到存储中,如果键名存在,则更新其对应的值。
	2. `xxxxxStorage.getItem('person');`
	
	 ​ 该方法接受一个键名作为参数,返回键名对应的值。
	3. `xxxxxStorage.removeItem('key');`
	
	 ​ 该方法接受一个键名作为参数,并把该键名从存储中删除。
	4. `xxxxxStorage.clear()`
	
	 ​ 该方法会清空存储中的所有数据。
4. 备注:


	1. SessionStorage存储的内容会随着浏览器窗口关闭而消失。
	2. LocalStorage存储的内容,需要手动清除才会消失。
	3. `xxxxxStorage.getItem(xxx)`如果xxx对应的value获取不到,那么getItem的返回值是null。
	4. `JSON.parse(null)`的结果依然是null。


#### 3.7 过渡与动画


##### 3.7.1 基本使用


1. 作用:在插入、更新或移除 DOM元素时,在合适的时候给元素添加样式类名。
2. 写法:


	1. 准备好样式:
	
	
		* 元素进入的样式:
			1. v-enter:进入的起点
			2. v-enter-active:进入过程中
			3. v-enter-to:进入的终点
		* 元素离开的样式:
			1. v-leave:离开的起点
			2. v-leave-active:离开过程中
			3. v-leave-to:离开的终点
	2. 使用`<transition>`包裹要过度的元素,并配置name属性:
	
	 
	```
	<transition name="hello">
		<h1 v-show="isShow">你好啊!</h1>
	</transition>
	
	```
	3. 备注:若有多个元素需要过度,则需要使用:`<transition-group>`,且每个元素都要指定`key`值。


##### 3.7.2 引入样式


https://animate.style/



厨师` `语义化`: * `dispatch`:客人点菜 * `Actions`:服务员记录数据,通过commit交给厨师Mutations * `Mutations`:开始做菜,返给顾客食用 * `getters`:阿姨对菜进行清洗、削皮啥的 `概述`: 在Vue中实现集中式状态(数据)管理的一个Vue插件,对vue应用中多个组件的共享状态进行集中式的管理(`读/写`),也是一种组件间通信的方式,且适用于**任意组件间通信** `范围`:多个组件要共享数据 #### 4.1 搭建vuex环境 1. 创建文件:`src/store/index.js` ``` //引入Vue核心库 import Vue from 'vue' //引入Vuex import Vuex from 'vuex' //应用Vuex插件 Vue.use(Vuex) //准备actions对象——响应组件中用户的动作 const actions = {} //准备mutations对象——修改state中的数据 const mutations = {} //准备state对象——保存具体的数据 const state = {} //创建并暴露store export default new Vuex.Store({ actions, mutations, state }) ``` 2. 在`main.js`中创建vm时传入`store`配置项 ``` ...... //引入store import store from './store' ...... //创建vm new Vue({ el:'#app', render: h => h(App), store }) ``` #### 4.2 基本使用 1. 初始化数据、配置`actions`、配置`mutations`,操作文件`store.js` ``` //引入vue核心库 import vue from 'vue' //引入vuex import vuex from 'vuex' //一般处理路径 // dispatch => actions => commit => mutations =>state // 快速处理 // commit => mutations =>state //全局使用vuex vue.use(vuex) //处理事件 const actions = { jia (context, value) { // console.log('actions',context); context.commit('JIA',value) }, jiaOdd (context, value) { if (context.state.sum % 2) { context.commit('JIA',value) } }, jiaWait (context, value) { setTimeout(() => { context.commit('JIA',value) },500) } } //处理数据 const mutations = { JIA (state,value) { state.sum += value // console.log('mutations',state); }, JIAN (state,value) { state.sum-=value }, ADD\_PERSON (state, value) { state.personList.unshift(value) } } //存储数据 const state = { sum: 0, name:'尚硅谷', subject: 'VUE', personList: [ {id:'001',name:'张三'}, {id:'002',name:'李四'}, ] } //数据加工 const getters = { bigSum (state) { return state.sum\*10 } } export default new vuex.Store({ actions, mutations, state, getters }) ``` 2. 组件中读取vuex中的数据:`$store.state.sum` 3. 组件中修改vuex中的数据:`$store.dispatch('action中的方法名',数据)`或 `$store.commit('mutations中的方法名',数据)` > > 备注:若没有网络请求或其他业务逻辑,组件中也可以越过actions,即不写`dispatch`,直接编写`commit` > > > #### 4.3 getters的使用 1. 概念:当state中的数据需要经过加工后再使用时,可以使用getters加工。 2. 在`store.js`中追加`getters`配置 ``` ...... const getters = { bigSum(state){ return state.sum \* 10 } } //创建并暴露store export default new Vuex.Store({ ### 最后 在面试前我花了三个月时间刷了很多大厂面试题,最近做了一个整理并分类,主要内容包括html,css,JavaScript,ES6,计算机网络,浏览器,工程化,模块化,Node.js,框架,数据结构,性能优化,项目等等。 包含了腾讯、字节跳动、小米、阿里、滴滴、美团、58、拼多多、360、新浪、搜狐等一线互联网公司面试被问到的题目,涵盖了初中级前端技术点。 * HTML5新特性,语义化 * 浏览器的标准模式和怪异模式 * xhtml和html的区别 * 使用data-的好处 * meta标签 * canvas * HTML废弃的标签 * IE6 bug,和一些定位写法 * css js放置位置和原因 * 什么是渐进式渲染 * html模板语言 * meta viewport原理 ![](https://img-blog.csdnimg.cn/img_convert/64590c67cb47cd552a892ba710477f64.png) * **[开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】](https://bbs.youkuaiyun.com/forums/4304bb5a486d4c3ab8389e65ecb71ac0)** ![](https://img-blog.csdnimg.cn/img_convert/17fdfcb90fad04acc5e7273d1f853880.png) .dispatch('action中的方法名',数据)`或 `$store.commit('mutations中的方法名',数据)` > > 备注:若没有网络请求或其他业务逻辑,组件中也可以越过actions,即不写`dispatch`,直接编写`commit` > > > #### 4.3 getters的使用 1. 概念:当state中的数据需要经过加工后再使用时,可以使用getters加工。 2. 在`store.js`中追加`getters`配置 ``` ...... const getters = { bigSum(state){ return state.sum \* 10 } } //创建并暴露store export default new Vuex.Store({ ### 最后 在面试前我花了三个月时间刷了很多大厂面试题,最近做了一个整理并分类,主要内容包括html,css,JavaScript,ES6,计算机网络,浏览器,工程化,模块化,Node.js,框架,数据结构,性能优化,项目等等。 包含了腾讯、字节跳动、小米、阿里、滴滴、美团、58、拼多多、360、新浪、搜狐等一线互联网公司面试被问到的题目,涵盖了初中级前端技术点。 * HTML5新特性,语义化 * 浏览器的标准模式和怪异模式 * xhtml和html的区别 * 使用data-的好处 * meta标签 * canvas * HTML废弃的标签 * IE6 bug,和一些定位写法 * css js放置位置和原因 * 什么是渐进式渲染 * html模板语言 * meta viewport原理 ![](https://img-blog.csdnimg.cn/img_convert/64590c67cb47cd552a892ba710477f64.png) * **[开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】](https://bbs.youkuaiyun.com/forums/4304bb5a486d4c3ab8389e65ecb71ac0)** ![](https://img-blog.csdnimg.cn/img_convert/17fdfcb90fad04acc5e7273d1f853880.png)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值