Vue学习2(B站尚硅谷)

Vue学习笔记

提示:上一节点击一下链接

Vue学习1

第一章 模块与组件、模块化与组件化

原生存在的问题:

  1. 依赖关系混乱,不好维护。
  2. 代码复用率不高。

模块:一个js文件。
组件:局部功能代码资源的集合。
模块化:当应用以模块编写,那么这个应用就是模块化的应用。
组件化:当应用以组件方式编写,那么这个应用就是组件化的应用。

非单文件组件:
一个文件中包含多个组件。
单文件组件:
一个文件中只包含一个组件。

第二章 非单文件组件-创建student组件

<body>
	<div id="root">
		<!-- 组件标签,可以使用单标签自闭和,但是单标签需要脚手架支持 -->
		<student></student>
		<x></x>
	</div>
	<script>
		const student = Vue.extend({	//组件不能写el:
			name:'Student',				//指定开发者工具下的组件名,不影响其他编写
			template:`<div><h2>{{name}}</h2></div>`,//组件结构
			data(){						//data必须使用函数式
				return{
					name:'张三456'
				}
			}
		})
		
		const x = Vue.extend({
			template:`<div><h2>全局组件</h2></div>`
		})
		//注册全局组件
		Vue.component('x',x)	//参数1是使用名,参数2是组件名,不能简写
		
		new Vue({
			el:'#root',
			components:{		//注册局部组件
				student			//完整写法:局部使用名:组件名,当使用名和组件名相同时,只写一个是等价效果
			}
		})
	</script>
</body>

1.1、组件名的命名规则

一个单词组成
student全小写
Student首字母大写(推荐)
多个单词组成
my-student-横杠分隔
MyStudent首字母大写,但必须有脚手架支持(推荐)
  • 不能与HTML标签冲突,(h1,H1,p,P…都不成立)

1.2、简写

//完整写法
const student = Vue.extend({
	template:`...`,
	data(){...}
})
//简写
const student = {
	template:`...`,
	data(){...}
}

1.3、组件的嵌套

<body>
	<div id="root">
	</div>
	<script>
		//三级组件
		const Student = Vue.extend({
			name:'Student',
			template:`
				<div>
					<h3>{{name}}</h3>
				</div>
			`,
			data(){
				return{
					name:'张三',
				}
			}
		})
		
		//二级组件
		const Sclool = Vue.extend({
			name:'Sclool',
			template:`
				<div>
					<h3>{{name}}</h3>
					<h3>{{address}}</h3>
					<Student></Student>
				</div>
			`,
			components:{
				Student
			},
			data(){
				return{
					name:'家里蹲大学',
					address:'上海'
				}
			}
		})
		
		// 一级组件
		const App = Vue.extend({
			template:`
			<div>
				<Sclool></Sclool>
			</div>
			`,
			components:{
				Sclool
			}
		})
		
		//实例对象
		new Vue({
			el:'#root',
			template:`<App></App>`,
			components:{App}
		})
	</script>
</body>

注意事项:

  • 子组件必须在父组件前定义

1.4、VueComponent()

  • 每一个组件实际上是一个VueComponent()构造函数,是由Vue.extend()生成的
  • 每次执行组件标签,会自动调用VueComponent()构造函数,且每次都是一个全新的构造函数

老师教课特殊点:VueComponent都简写为vc,方便教学,但其他地方不认

1.5、一个重要的内置关系

  1. 一个重要的内置关系:VueComponent.prototype.proto === Vue.prototype
  2. 为什么要有这个关系:让组件实例对象(vc)可以访问到 Vue 原型上的属性、方法

内置关系

第三章 单文件组件(重点)

vs-code
高亮插件:vetur
模板快捷键:<v+Enter
HBuilder X
高亮:(自带)
模板快捷键:vb+Enter

3.1、安装脚手架

  1. 第一步安装node.js: https://nodejs.org/zh-cn/
  2. 第二步dom内输入配置淘宝镜像:npm config set registry http://registry.npm.taobao.org
  3. 第三步dom内输入:npm install -g @vue/cli
  4. 第四步切换到指定文件夹dom下:vue create xxx
  5. 选择vue版本
  6. 当前路径下启动项目:npm run serve

3.2、render()函数

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

Vue.config.productionTip = false

new Vue({
	el:'#root',
	//简写
	render: h => h(App)
	//完整写法
	// render(h) {
	// 	return h(App)
	// }	
})

vue.js 与 vue.runtime.xxx.js的区别:

  1. vue.js 是完整版的 Vue,包含:核心功能+模板解析器
  2. vue.runtime.xxx.js 是运行版的 Vue,只包含核心功能,没有模板解析器

因为 vue.runtime.xxx.js 没有模板解析器,所以不能使用 template 配置项,需要使用 render函数接收到的createElement 函数去指定具体内容

3.3、脚手架默认配置的修改

脚手架文件路径

  • 不要改的文件名都可以改,在脚手架根目录下的vue.config.js里面修改配置。要么修改,要么别写,空的pages属性会报错。
  • 详见配置参考 | 配置参考 | CLI
module.exports = {
  pages: {
    index: {
      //入口
      entry: 'src/index/main.js',
      // 模板来源
      template: 'public/index.html',
    }
  },
   // 关闭语法检查
  lineOnSave:false
}

3.4、ref属性

<template>
	<div>
		<h3 ref="x1">这是一个h3标签</h3>
		<button @click="dome">点我获取上方DOM元素</button>
		<MyStudent ref="y1"></MyStudent>
	</div>
</template>

<script>
	import MyStudent from './components/MyStudent'
	export default {
		name:'App',
		components:{
			MyStudent
		},
		methods:{
			dome(){
				console.dir(this.$refs.x1)	//真实DOM
				console.dir(this.$refs.y1)	//MyStudent 组件实例对象
				console.dir(this.$refs)		//所以ref属性标识的标签...
			}
		}
	}
</script>

总结

  • 用来给元素或子组件注册引用信息(id的替代者)
  • 应用在html标签上获取的是真实DOM元素,应用在组件标签上获取的是组件实例对象

3.5、props

props 中的数据不能修改,如果要改变,可以使用data中的数据接收props的数据,改变data数据实现
props 的数据比 data 中的数据优先级更高;
props 中的数据名不能与属性名冲突

//IsStudent子组件
<template>
	<div>
		<h3>{{name}}</h3>
		<h3>{{myAge}}</h3>
		<button @click="myAge++">点我年龄加1</button>
	</div>
</template>

<script>
	export default {
		name:'IsStudent',
		data() {
			return {
				myAge:this.age
			}	
		},
		//简单声明
		// props:['name','age'],
		
		//声明时对数据类型进行验证
		// props:{
		// 	name:String,
		// 	age:Number
		// }
		
		//声明时对数据类型进行验证+必填限制+默认值
		// props:{
		// 	name:{
		// 		type:String,
		// 		required:true		//说明name必填,不填会控制台报错,无输出
		// 	},
		// 	age:{
		// 		type:Number,
		// 		default:99		//当没有从父组件输入age时,默认为99
		// 	}
		// }
		
		//事件处理 回顾
		// methods:{
		// 	dome(){
		// 		this.myAge++
		// 	}
		// }
	}
</script>
//App父组件
<template>
	<div>
		<IsStudent name="张三" :age="18"/><hr/>
		<IsStudent name="李四" :age="19"/><hr/>
		<IsStudent name="王老五"/><hr/>
	</div>
</template>

<script>
	import IsStudent from './components/IsStudent.vue'
	export default {
		name:'App',
		components:{
			IsStudent
		}
	}
</script>

3.5、mixin 混入(混合)

作用:把多个组件共用的配置提取成一个混入对象
使用方式:
第一步:定义混入:

export const xxx = {//分别暴露
	data(){...},
	methods:{...}
}

第二部:引入混合:

import {xxx} from './...'

第三步:配置混合

Vue.mixin(xxx)	//全局混入,直接在mian.js下引用+配置
mixins:[xxx,xxx2,...]	//局部混入

注意:

  1. 混入相同属性时,以原有的为主,混入的那一个属性不奏效。
  2. 生命周期函数,先输出混入中的,都会输出。

3.6、插件

作用:
使用方式:
第一步:定义插件:

export default= {//默认暴露
	install(Vue){
		//过滤器
		//全局自定义指令
		//全局混入
		//添加实例方法
	}
}

第二部:引入:

import xxx from './...'

第三步:应用插件:

Vue.use(xxx)

注意:

  1. 引入和应用都要在Vue前进行

3.7、scoped样式

作用:让样式在局部生效,防止取名冲突

<style scoped>
	...
<style>
  • 16
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值