说明
.vue
文件需要脚手架帮忙转换翻译浏览器才认识具体步骤
解决npm warn config global --global
, --local
are deprecated. use --location=global
instead.
第一步(仅第一次执行):全局安装@vue/cli
npm install --location=global @vue/cli
vue create xxxx
第三步:启动项目(对项目进行编译初始化)
npm run serve
备注
npm config set registry https://registry.npm.taobao.org
vue inspect > output.js
执行顺序:
在vscode终端(ctrl
+~
)执行了npm run serve
-> 来到maxin.js
引入App.vue
-> 来到App.vue
引入组件School
->maxin.js
里面创建实例对象将App
放入容器里index.html
里面组件的名字要用驼峰法!!!
main.js 代码
// 该文件是整个项目的入口文件
// 引入Vue
import Vue from 'vue'
// 引入App组件,他是所有组件的父组件
import App from './App.vue'
// 关闭Vue的生产提示
Vue.config.productionTip = false
// 创建vue实例对象 ---vm
new Vue({
el:'#app',
// 完成了这个功能:将App组件放入容器中
render: h => h(App),
})
index.html 代码
<!DOCTYPE html>
<html lang="">
<head>
<meta charset="utf-8">
<!-- 针对IE浏览器的一个特殊配置,含义是让IE浏览器以最高的渲染级别渲染页面 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<!-- 开启移动端的理想视口 -->
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<!-- 配置页签的图标 -->
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<!-- 配置网页的标题 -->
<title>
<%= htmlWebpackPlugin.options.title %>
</title>
</head>
<body>
<!-- 如果浏览器不支持JS,noscript中的元素就会被渲染 -->
<noscript>
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled.
Please enable it to continue.</strong>
</noscript>
<!-- 容器 -->
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>
关于不同版本的 Vue
vue.js
与vue.runtime.xxx.js
的区别:
(1)vue.js
是完整版的Vue,包含:核心功能+模板解析器。
(2)vue.runtime.xxx.js
是运行时版的Vue,只包含:核心功能;没有模板解析器。
因为vue.runtime.xxx.js
没有模板解析器,所以不能使用template配置项所以在new Vue
的时候不能写template
,需要使用render
函数接收到的createElement
函数去指定具体内容。
render是个函数,vue帮你调用,调用的时候传递一个createElement函数,这个函数能创建具体的元素
new Vue({
el:'#app',
// 完成了这个功能:将App组件放入容器中
render: h => h(App),
})
render完整写法:
render(createElement){
return createElement('h1','你好啊')
},
使用箭头函数简写:
render:createElement=> createElement(App),
render参数方法说明
内置创建元素的方法,第一个参数是创建的内置元素,第二个参数是元素内容
为什么不引入完整的Vue?
完整Vue包含了核心功能+模板解析器,但最终我们项目打包的时候,webpack会帮我们解析模板,为了减轻容量大小,所以选择了去掉模板解析器的Vue版本
为什么组件里的模板就可以解析呢?
脚手架里提供了模板编译器的库,专门解析标签里面的模板组件,完美取代了Vue的编译器
vue inspect > output.js
可以查看到Vue脚手架的默认配置(output.json)。vue.config.js
可以对脚手架进行个性化定制,详情见:https://cli.vuejs.org/zh脚手架的哪些默认配置不能改?
- Vue.config.xxx 与 vue.config.js 有啥区别?
前者是给vue构造函数身上的某个属性配置属性,后者是配置脚手架工作模式的
在 vue.config.js
里面 关闭语法检查
module.exports = defineConfig({
transpileDependencies: true,
lintOnSave:false // 关闭语法检查
})
.....
或
this.$refs.xxx
App.vue 代码:
<template>
<div>
<h1 v-text="msg" ref="title"></h1>
<button @click="showDOM" ref="btn">点我输出上方的DOM元素</button>
<SchoolName ref="sch"/>
</div>
</template>
<script>
// 引入SchoolName组件
import SchoolName from './components/SchoolName.vue'
export default {
name:'App',
components:{SchoolName},
data(){
return {
msg:'2022-7-17'
}
},
methods:{
showDOM(){
console.log(this); // 组件中的this均指向VueComponent实例对象
console.log(this.$refs.title); // 真实DOM元素
console.log(this.$refs);
console.log(this.$refs.sch); // 给组件加的话,会获得SchoolName组件实例对象(vc)
// 在原生JS里面这样获取DOM元素
// console.log(document.querySelector('#title'));
}
}
}
</script>
<style>
</style>
功能:让组件接收外部传过来的数据
传递数据:
或<Demo :age="xxx"/>
(前者"“中是字符串,后者”"中是表达式) !注意 :这里StudentName.vue
没有在组件里面传入数据
v-bind
得到的是表达式,里面可以进行运算
接收数据:
第一种方式(只接收):props:['name']
第二种方式(限制类型):props:{name:String}
// 接收的同时对数据进行类型限制
props:{
name:String,
age:Number,
sex:String
}
第三种方式(限制类型、限制必要性、指定默认值):
// 接收的同时对 数据进行类型限制+ 默认值的指定+ 必要性的限制
props:{
name:{
type:String, // name的类型是字符串
required:true, // name是必要 传参的
},
age:{
type:Number,
default:99, // 不传参的话默认值是 99
},
sex:{
type:String, // name的类型是字符串
required:true, // name是必要的
}
}
}
备注:
props
与data
是有区别的,props
是只读的,Vue底层会监测你对props
的修改,如果进行了修改,就会发出警告props
的内容到data中一份,然后去修改data中的数据。功能:可以把多个组件共用的配置提取成一个混入对象
功能:用于增强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
}
作用:让样式在局部生效,防止冲突。
写法:
原因:如果不加scoped
样式,组件里面的样式在项目里面只能写一次,其他组件写的话会覆盖掉,加上的话就可以让样式在单个组件里生效,不影响其他组件的样式命名
vue里的style标签 可以使用
less
,前提是下载less-loader ,在终端输入npm i less-loader
实现动态组件:考虑好数据的存放位置,数据是一个组件在用,还是一些组件在用:
(1).一个组件在用:放在组件自身即可。
(2). 一些组件在用:放在他们共同的父组件上App.vue(状态提升)。
(3). 用:指的是 读 或者 写
实现交互:从绑定事件开始。
// App.vue
<MySon :chuandi="chuandi" />
// MySon.vue
props:["chuandi"]
使用v-model
时要切记:v-model
绑定的值不能是props
传过来的值,因为props
是不可以修改的!
props
传过来的若是对象类型的值,修改对象中的属性时Vue不会报错,但不推荐这样做。
完整 todolist 过程笔记请点击----> TodoList
存储内容大小一般支持5MB左右(不同浏览器可能还不一样)
浏览器端通过 Window.sessionStorage
和 Window.localStorage
属性来实现本地存储机制。
相关API:
xxxxxStorage.setItem('key', 'value');
xxxxxStorage.getItem('person');
xxxxxStorage.removeItem('key');
xxxxxStorage.clear()
备注:
SessionStorage
存储的内容会随着浏览器窗口关闭而消失。LocalStorage
存储的内容,需要手动清除才会消失(调api或清除缓存)。xxxxxStorage.getItem(xxx)
如果xxx对应的value获取不到,那么getItem的返回值是null。JSON.parse(null)
的结果依然是null。更多见—>【黑马】本地存储
一种组件间通信的方式,适用于:子组件 ===> 父组件
使用场景:A是父组件,B是子组件,B想给A传数据,那么就要在A中给B绑定自定义事件(事件的回调在A中)。
绑定自定义事件:
组件上也可以绑定原生DOM事件,需要使用native
修饰符。
<StudentName ref="student" @click.native="show"/>
在App.vue中给组件绑定了click点击事件,但是需要加 native
注意:通过this.$refs.xxx.$on('atguigu',回调)
绑定自定义事件时,回调要么配置在methods中,要么用箭头函数,否则this指向会出问题!
一种组件间通信的方式,适用于任意组件间通信。
安装全局事件总线:
new Vue({
......
beforeCreate() {
Vue.prototype.$bus = this //安装全局事件总线,$bus就是当前应用的vm
},
......
})
使用事件总线:
$bus
是一个傀儡,才能让任意组件通过他来传数据Vue.prototype
任何组件vc都可以看到$on
等方法一种组件间通信的方式,适用于 任意组件间通信。
使用步骤:
安装pubsub:npm i pubsub-js
哪里用就哪里引入: import pubsub from 'pubsub-js'
我两个子组件进行消息订阅与发布,我的两个子组件分别引用在script
标签里
接收数据:A组件想接收数据,则在A组件中订阅消息,订阅的回调留在A组件自身。
methods(){
demo(data){......}
}
......
mounted() {
this.pid = pubsub.subscribe('xxx',this.demo) //订阅消息
}
最好在beforeDestroy钩子中,用PubSub.unsubscribe(pid)
去取消订阅。
this.$nextTick(回调函数)
nextTick
所指定的回调函数中执行。@keyframes atguigu {
from{
transform: translateX(-100%);
}
to{
transform: translateX(0px);
}
}
.name-enter-active
,没有的话就是v-enter-active
v-enter-active
和v-leave-active
就可以啦v-enter
是进入的起点,v-enter-active
是进入的过程,v-enter-to
是进入的终点v-enter/leave-active
加上transition效果作用:在插入、更新或移除 DOM元素时,在合适的时候给元素添加样式类名。
写法:
第一步:下载动画库
npm install animate.css
第二步:导入动画库
import 'animate.css'
第三步:基本使用
<transition-group
appear
name="animate__animated animate__bounce"
enter-active-class="animate__swing"
leave-active-class="animate__backOutUp"
>
<h1 v-show="isShow" key="1">引入</h1>
<h1 v-show="isShow" key="2">动画库</h1>
</transition-group>