
vue基础vue-cli:vue-cli是vue脚手架,专门做工程化开发vue-router:vue-router用于在vue中实现前端路由vuex:当应用足够复杂时,可以借助vuex保管数据element-ui:ui组件库vue3Vue组件化编程 模块与组件、模块化与组件化
非单文件组件模块
理解:向外提供特定功能的js程序,一般就是一个js文件。
为什么用:js文件很多很复杂。
作用:复用js,简化js的编写,提高js运行效率。
组件
组件的定义:实现应用中局部功能代码和资源的集合。
为什么用:一个界面的功能很复杂
作用:复用编码,简化项目编码,提高运行效率
模块化
当应用中的js都以模块来编写的,那这个应用就是一个模块化的应用。
组件化
当应用中的功能都是多组件的方式来编写的,那这个应用就是一个组件化应用。
一个文件中包含有n个组件
基本使用组件的几个注意点Vue中使用组件的三大步骤:
定义组件(创建组件)注册组件使用组件(写组件标签)如何定义一个组件?
使用
Vue.extend(options)创建,其中options和new Vue(options)时传入的那个options几乎一样,但也有点区别; 区别如下:
el不要写,为什么?——最终所有的组件都要经过一个vm的管理,由vm中的el决定服务哪个容器。
data必须写成函数,为什么? —— 避免组件被复用时,数据存在引用关系。备注:使用template可以配置组件结构。
如何注册组件?
局部注册:靠new Vue的时候传入components选项全局注册:靠Vue.component(‘组件名’,组件)编写组件标签:
<body> <div id="root"> <hello>hello> <h1>{{msg}}h1> <hr> <school>school> <hr> <student>student> <student>student> div> <div id="root2"> <hello>hello> div> body> <script type="text/javascript"> Vue.config.productionTip = false; //创建school组件 const xuexiao = Vue.extend({ //el: '#root', template: ` 学校名称:{{schoolName}} 学校地址:{{address}} `, data() { return { schoolName: '果粒陈', address: '北京朝阳区' } }, methods: { showName(){ alert(this.schoolName); }, }, }) //创建student组件 const student = Vue.extend({ template: ` 学生名称:{{studentName}} 学生年龄:{{age}} `, data() { return { studentName: '张三', age: 18 } } }) const hello = Vue.extend({ template:` 你好啊!{{name}} `, data() { return { name:'tom' } } }) //全局注册组件 Vue.component('hello',hello); new Vue({ el: '#root', data:{ msg:'你好呀' }, //注册组件(局部注册) components: { //组件名:创建时的名字(也可以简写) school: xuexiao, student } }), new Vue({ el: '#root2', components : { student, }, }) script>
组件的嵌套组件名推荐:
如果组件名只有一个字母,那么推荐:
第一种写法(首字母小写):
school第二种写法(首字母大写):
Schoolcomponents:{ school:xuexiao,//小写 School:xuexiao,//首字母大写 }<school>school> <School>School>如果组件名由多个单词组成,那么推荐:
第一种写法(kebab-case命名):
my-school第二种写法(CamelCase命名):
MySchool(需要脚手架支持)components:{ myschool:xuexiao,//全小写 'my-school':xuexiao,//kebab-case命名 MySchool:xuexiao,//CamelCase命名(需要Vue脚手架) }<myschool>myschool> <my-school>my-school> <MySchool>MySchool>注意:
组件名尽可能回避HTML中已有的元素名称,例如h2、H2都不行定义组件时可以使用name配置项指定组件在开发者工具中呈现的名字关于组件标签:
第一种写法:第二种写法:备注:不使用脚手架时,会导致后续组件不能渲染一个简写方式:
const school = Vue.extend(options)可简写为:const school = options<body> <div id="root"> <h1>{{msg}}h1> <school>school> div> body> <script type="text/javascript"> Vue.config.productionTip = false; //定义组件 const school = ({ name: 'cxj', template: ` 学校名称:{{name}} 学校地址:{{address}} `, data() { return { name: '果粒陈', address: '北京' } }, }) new Vue({ el: '#root', data: { msg: '欢迎学习Vue!' }, //局部注册 components: { school } }) script>
<body>
<div id="root">
div>
body>
<script type="text/javascript">
Vue.config.productionTip = false;
//创建student组件
const student = Vue.extend({
template: `
学生姓名:{{name}}
学生年龄:{{age}}
`,
data() {
return {
name: '张三',
age: 18
}
}
})
//定义school组件
const school = Vue.extend({
template: `
学校名称:{{name}}
学校地址:{{address}}
`,
data() {
return {
name: '果粒陈',
address: '北京'
}
},
components: {
student
}
})
//定义一个hello组件
const hello = Vue.extend({
template: `{{msg}}`,
data() {
return {
msg: '欢迎欢迎!'
}
}
})
//定义app组件
const app = Vue.extend({
template: `
`,
components: {
school,
hello
}
})
//创建vm
new Vue({
template: ``,
el: '#root',
//局部注册组件
components: {
app
}
})
script>
VueComponent
一个重要的内置关系school组件本质是一个名为VueComponent的构造函数,且不是程序员定义的,是Vue.extend生成的。我们只需要写或,Vue解析时会帮我们创建school组件的实例对象,即Vue帮我们执行的:new VueComponent(options)。特别注意:每次调用Vue.extend,返回的都是一个全新的VueComponent!!!!关于this指向: 组件配置中:data函数、methods中的函数、watch中的函数、computed中的函数,它们的this均是【VueComponent实例对象】。new Vue(options)配置中:data函数、methods中的函数、watch中的函数、computed中的函数 它们的this均是【Vue实例对象】。VueComponent的实例对象,在这个笔记中以后简称vc(也可称之为:组件实例对象)。Vue的实例对象,以后简称vm。
单文件组件一个重要的内置关系:
VueComponent.prototype.__proto__ === Vue.prototype为什么要有这个关系:让组件实例对象(vc)可以访问到 Vue原型上的属性、方法。
一个文件中只包含有一个组件
一个.vue文件的组成命名:
school.vueSchool.vue(常用)my-school.vueMySchool.vue(常用)
1、模板页面
<template> 页面模板 template>
2、js模块对象
<script> export default { data() { return {} }, methods: {}, computed: {}, components: {} } script>
基本使用 引入组件映射成标签使用组件标签 使用Vue脚手架3、样式
<style> 样式定义 style>
Vue CLI(command line interface)
第一步(仅第一次执行):全局安装@vue/cli。
npm install -g @vue/cli
第二步:切换到你要创建项目的目录,然后使用命令创建项目
vue create xxxx
第三步:启动项目
npm run serve
备注:
如出现下载缓慢请配置 npm 淘宝镜像
npm config set registry https://registry.npm.taobao.org
Vue 脚手架隐藏了所有 webpack 相关的配置,若想查看具体的 webpakc 配置, 请执行
vue inspect > output.js
分析脚手架结构
render函数node_modulespublicfavicon.icon: 页签图标index.html:主页面srcassets:存放静态资源logo.pngcomponent:存放组件HelloWorld.vueApp.vue:汇总所有组件main.js:入口文件.gitignore:git 版本管制忽略的配置babel.config.js:babel 的配置文件jsconfig.json:package-lock.json:包版本控制文件package.json:应用包配置文件README.md:应用描述文件vue.config.js:
修改默认配置关于不同版本的Vue:
vue.js与vue.runtime.xxx.js的区别:vue.js是完整版的Vue,包含:核心功能+模板解析器。vue.runtime.xxx.js是运行版的Vue,只包含:核心功能;没有模板解析器。 因为vue.runtime.xxx.js没有模板解析器,所以不能使用template配置项,需要使用render函数接收到的createElement函数去指定具体内容。
ref与props ref属性vue.config.js配置文件
使用vue inspect>output.js 可以查看Vue脚手架的默认配置
使用vue.config.js可以对脚手架进行个性化定制,详见:https://cli.vuejs.org/zh/
props配置被用来给元素或子组件注册引用信息(id的替代者)
应用在html标签上获取的是真实DOM元素,应用在组件标签上是组件的实例对象(vc)
使用方式:
打标识:
<h1 ref="xxx">h1> <School ref="xxx"/>获取:
this.$refs.xxx
mixin混入(混合)功能:让组件接收外部传过来的数据
传递数据:
接收数据:
第一种方式(只接收):
props:['name']第二种方式(限制类型):
props:{ name:String }第三种方式(限制类型、限制必要性、指定默认值):
props:{ name:{ type:String, //类型 required:true, //必要性 default:'老王' //默认值 } }备注:
props是只读的,Vue底层会监测你对props的修改,如果进行了修改,就会发出警告,若业务需求确实需要修改,那么请复制props的内容到data中一份,然后去修改data中的数据。Student.vue {{msg}} 学生的姓名:{{name}} 学生的性别:{{sex}} 学生的年龄:{{myAge+1}}/App.vue
插件功能:可以把多个组件共用的配置提取成一个混入对象
使用方式:
第一步定义混合:
{ data(){....}, methods:{....} .... }第二步使用混入:
全局混入:
Vue.mixin(xxx)(在main.js中进行引入配置)//全局混合 import {mixin,mixin2} from './mixin.js' //配置 Vue.mixin(mixin) Vue.mixin(mixin2)局部混入:
mixins:['xxx'](在组件中进行引入配置)//局部混合 import {mixin,mixin2} from "../mixin.js" //配置 mixins:[mixin,mixin2]
scoped样式功能:用于增强Vue
本质:包含install方法的一个对象,install的第一个参数是Vue,第二个以后的参数是插件使用者传递的数据。
定义插件。例如:
对象.install = function (Vue, options) { // 1. 添加全局过滤器 Vue.filter(....) // 2. 添加全局指令 Vue.directive(....) // 3. 配置全局混入(合) Vue.mixin(....) // 4. 添加实例方法 Vue.prototype.$myMethod = function () {...} Vue.prototype.$myProperty = xxxx }使用插件:
引入插件:import plugins from './plugins'应用插件:Vue.use()
作用:让样式在局部生效,防止冲突。写法:
Todo-list案例
组件化编码流程
实现静态组件:抽取组件,使用组件实现静态页面效果展示动态数据: 数据的类型、名称是什么?数据保存在哪个组件? 交互—从绑定事件监听开始案例总结
webStorage组件化编码流程:
拆分静态组件:组件要按照功能点拆分,命名不要与html元素冲突实现动态组件:考虑好数据的存放位置,数据是一个组件在用,还是一些组件在用: 一个组件在用:放在组件自身即可一些组件在用:放在他们共同的父组件上(状态提升) 实现交互:从绑定事件开始props适用于:
父组件==>子组件【通信】子组件==>父组件【通信(要求父先给子一个函数)】使用
v-model时要切记:v-model绑定的值不能是props传过来的值,因为props是不可以修改的!props传过来的若是对象类型的值,修改对象中的属性时Vue不会报错,但是不推荐这样做。
webStorage 浏览器本地存储
组件自定义事件存储内容大小一般支持5MB左右(不同浏览器可能还不一样)
浏览器端通过
Window.sessionStorage和Window.localStorage属性来实现本地存储机制。相关API:
xxxxxStorage.setItem('key', 'value');该方法接受一个键和值作为参数,会把键值对添加到存储中,如果键名存在,则更新其对应的值。
xxxxxStorage.getItem('person');该方法接受一个键名作为参数,返回键名对应的值。
xxxxxStorage.removeItem('key');该方法接受一个键名作为参数,并把该键名从存储中删除。
xxxxxStorage.clear()该方法会清空存储中的所有数据。
备注:
SessionStorage存储的内容会随着浏览器窗口关闭而消失。LocalStorage存储的内容,需要手动清除才会消失。xxxxxStorage.getItem(xxx)如果xxx对应的value获取不到,那么getItem的返回值是null。JSON.parse(null)的结果依然是null。
全局事件总线一种组件间通信的方式,适用于:子组件 ===> 父组件
使用场景:A是父组件,B是子组件,B想给A传数据,那么就要在A中给B绑定自定义事件(事件的回调在A中)。
绑定自定义事件:
第一种方式,在父组件中:
或第二种方式,在父组件中:
<Demo ref="demo"/> ...... mounted(){ this.$refs.xxx.$on('atguigu',this.test) }若想让自定义事件只能触发一次,可以使用
once修饰符,或$once方法。触发自定义事件:
this.$emit('atguigu',数据)解绑自定义事件
this.$off('atguigu')组件上也可以绑定原生DOM事件,需要使用
native修饰符。注意:通过
this.$refs.xxx.$on('atguigu',回调)绑定自定义事件时,回调要么配置在methods中,要么用箭头函数,否则this指向会出问题!
消息订阅与发布全局事件总线(GlobalEventBus)
一种组件间通信的方式,适用于任意组件间通信。
安装全局事件总线:
new Vue({ ...... beforeCreate() { Vue.prototype.$bus = this //安装全局事件总线,$bus就是当前应用的vm }, ...... })使用事件总线:
接收数据:A组件想接收数据,则在A组件中给$bus绑定自定义事件,事件的回调留在A组件自身。
methods(){ demo(data){......} } ...... mounted() { this.$bus.$on('xxxx',this.demo) }提供数据:
this.$bus.$emit('xxxx',数据)最好在beforeDestroy钩子中,用$off去解绑当前组件所用到的事件。
nextTick一种组件间通信的方式,适用于任意组件间通信。
使用步骤:
安装pubsub:
npm i pubsub-js引入:
import pubsub from 'pubsub-js'接收数据:A组件想接收数据,则在A组件中订阅消息,订阅的回调留在A组件自身。
methods(){ demo(data){......} } ...... mounted() { this.pid = pubsub.subscribe('xxx',this.demo) //订阅消息 }提供数据:
pubsub.publish('xxx',数据)最好在beforeDestroy钩子中,用
PubSub.unsubscribe(pid)去取消订阅。
语法:this.$nextTick(回调函数)作用:在下一次 DOM 更新结束后执行其指定的回调。什么时候用:当改变数据后,要基于更新后的新DOM进行某些操作时,要在nextTick所指定的回调函数中执行。
过渡与动画
手动写
3 你好啊! {script}
你好啊! 果粒陈!
vue中的过渡与动画
作用:在插入、更新或移除 DOM元素时,在合适的时候给元素添加样式类名。
图示:
写法:
准备好样式:
元素进入的样式: v-enter:进入的起点v-enter-active:进入过程中v-enter-to:进入的终点 元素离开的样式: v-leave:离开的起点v-leave-active:离开过程中v-leave-to:离开的终点使用
包裹要过度的元素,并配置name属性:你好啊! 备注:若有多个元素需要过度,则需要使用:
,且每个元素都要指定key值。vue中可以集成第三方动画
比如npm中的animate.css
安装:
npm install animate.css引入:
import 'animate.css'你好啊! 果粒陈!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)