Vue CLI是一个基于 Vue.js 进行快速开发的完整系统,通过 @vue/cli 实现的交互式的项目脚手架。
1. 初始化脚手架
1.首先(仅第一次执行)在终端执行npm install -g @vue/cli 全局安装@vue/cli 。
2.切换到你要创建项目的目录,然后使用命令创建项目 vue create xxxx 3.执行命令npm run serve 可以启动项目
2. 脚手架文件结构分析
使用命令创建项目 vue create xxxx 创建项目后所得的脚手架文件结构 如下所示。
├── 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:包版本控制文件
示例: 1.index.html 分析
<!DOCTYPE html>
<html lang="">
<head>
<meta charset="utf-8">
<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">
<link rel="stylesheet" href="<%= BASE_URL %>css/bootstrap.css">
<title>Joney</title>
</head>
<body>
<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>
</body>
</html>
2.这里我将原给的hello.vue 组件 换成了 School.vue 和student.vue ,在vue文件中可以写三个标签<template> 页面模板、<script> 模板对象和<style> 样式。
如下是Scool.vue :
<template>
<div class="demo">
<h2>学校名称:{{name}}</h2>
<h2>学校地址:{{address}}</h2>
<button @click="showName">点我提示学校名</button>
</div>
</template>
<script>
export default {
name:'School',
data(){
return {
name:'湖南大学',
address:'湖南'
}
},
methods: {
showName(){
alert(this.name)
}
},
}
</script>
<style>
.demo{
background-color: orange;
}
</style>
Student.vue
<template>
<div>
<h2>学生姓名:{{name}}</h2>
<h2>学生年龄:{{age}}</h2>
</div>
</template>
<script>
export default {
name:'Student',
data(){
return {
name:'张三',
age:18
}
}
}
</script>
App.vue :负责汇总所有组件
<template>
<div>
<img src="./assets/logo.png" alt="logo">
<School></School>
<Student></Student>
</div>
</template>
<script>
import School from './components/School'
import Student from './components/Student'
export default {
name:'App',
components:{
School,
Student
}
}
</script>
3.main.js 是整个项目的入口文件
(1)vue.js 是完整版的Vue,包含:核心功能+模板解析器。import Vue from 'vue' 这里引入的是vue.runtime.xxx.js ,其是运行版的Vue,只包含:核心功能;没有模板解析器。
(2)因为vue.runtime.xxx.js 没有模板解析器,所以不能使用template配置项,需要使用 render 函数接收到的createElement 函数去指定具体内容。
import Vue from 'vue'
import App from './App.vue'
Vue.config.productionTip = false
new Vue({
el:'#app',
render: h => h(App)
})
4.在执行npm run serve 之前最好在vue.config.js 配置不检查语法错误。
module.exports={
lintOnSave:false,
}
5.执行npm run serve 启动项目,并打开该网页
3. ref属性
-
ref属性被用来给元素 或子组件 注册引用信息(id的替代者,获取标签),应用在html标签上获取的是真实DOM元素,应用在组件标签上是组件实例对象(vc) -
使用方式: (1)打标识:<h1 ref="xxx">.....</h1> 或 <School ref="xxx"></School> (2)获取:this.$refs.xxx -
代码
<template>
<div>
<h1 v-text="msg" ref="title"></h1>
<button ref="btn" @click="showDOM">点我输出上方的DOM元素</button>
<School ref="sch"/>
</div>
</template>
<script>
import School from './components/School'
export default {
name:'App',
components:{School},
data() {
return {
msg:'欢迎学习Vue!'
}
},
methods: {
showDOM(){
console.log(this.$refs.title)
console.log(this.$refs.btn)
console.log(this.$refs.sch)
}
},
}
</script>
4. props配置项
1.功能:让组件接收外部传过来的数据,其优先级高。
2.传递数据:<Demo name="xxx"/> ,这里age使用v-bind进行数据绑定,确保收到的内容是引号里的内容
<Student name="李四" sex="女" :age="18"/>
3.接收数据:
- 第一种方式(只接收):
props:['name']
props:['name','age','sex']
- 第二种方式(限制类型):
props:{name:String}
props:{
name:String,
age:Number,
sex:String
}
props:{
name:{
type:String,
required:true,
},
age:{
type:Number,
default:99
},
sex:{
type:String,
required:true
}
}
4.代码 App.vue
<template>
<div>
<Student name="李四" sex="女" :age="18"/>
</div>
</template>
<script>
import Student from './components/Student'
export default {
name:'App',
components:{Student}
}
</script>
Student.vue
<template>
<div>
<h1>{{msg}}</h1>
<h2>学生姓名:{{name}}</h2>
<h2>学生性别:{{sex}}</h2>
<h2>学生年龄:{{age}}</h2>
</div>
</template>
<script>
export default {
name:'Student',
data() {
return {
msg:'我是一个学生',
}
},
props:{
name:{
type:String,
required:true,
},
age:{
type:Number,
default:99
},
sex:{
type:String,
required:true
}
}
}
</script>
5.注意
props是只读的,Vue底层会监测你对props的修改,如果进行了修改,就会发出警告,若业务需求确实需要修改,那么请复制props的内容到data中一份,然后去修改data中的数据。
<template>
<div>
<h1>{{msg}}</h1>
<h2>学生姓名:{{name}}</h2>
<h2>学生性别:{{sex}}</h2>
<h2>学生年龄:{{myAge+1}}</h2>
<button @click="updateAge">尝试修改收到的年龄</button>
</div>
</template>
<script>
export default {
name:'Student',
data() {
return {
msg:'我是一个学生',
myAge:this.age
}
},
methods: {
updateAge(){
this.myAge++
}
},
props:{
name:{
type:String,
required:true,
},
age:{
type:Number,
default:99
},
sex:{
type:String,
required:true
}
}
}
</script>
5. mixin混入
1.功能:可以把多个组件共用的配置提取成一个混入对象
2.使用方式:
(1)定义混合:
export const hunhe = {
methods: {
showName(){
alert(this.name)
}
},
mounted() {
console.log('你好啊!')
},
}
export const hunhe2 = {
data() {
return {
x:100,
y:200
}
},
}
(2)使用混入
- 第一种:在
student.vue 中局部混入mixins:['xxx']
<template>
<div>
<h2 @click="showName">学生姓名:{{name}}</h2>
<h2>学生性别:{{sex}}</h2>
</div>
</template>
<script>
import {hunhe,hunhe2} from '../mixin'
export default {
name:'Student',
data() {
return {
name:'张三',
sex:'男',
x:66
}
},
mixins:[hunhe,hunhe2]
}
</script>
注意: 当在student.vue 和混入对象 中也有x数据时,以student.vue 自身的为标准。但是对于生命周期钩子函数,student.vue 和混入对象 中的都会生效。
- 第二种:在
main.js 中全局混入Vue.mixin(xxx)
import Vue from 'vue'
import App from './App.vue'
import {hunhe,hunhe2} from './mixin'
Vue.config.productionTip = false
Vue.mixin(hunhe)
Vue.mixin(hunhe2)
new Vue({
el:'#app',
render: h => h(App)
})
6. 插件
1.功能 :用于增强Vue
2.本质 :包含install 方法的一个对象,install的第一个参数是Vue,第二个以后的参数是插件使用者传递的数据。
3.定义插件(示例)
这里定义的所有东西,vm和组件实例对象(vc)都可以使用。
export default {
install(Vue,x,y,z){
console.log(x,y,z)
Vue.filter('mySlice',function(value){
return value.slice(0,4)
})
Vue.directive('fbind',{
bind(element,binding){
element.value = binding.value
},
inserted(element,binding){
element.focus()
},
update(element,binding){
element.value = binding.value
}
})
Vue.mixin({
data() {
return {
x:100,
y:200
}
},
})
Vue.prototype.hello = ()=>{alert('你好啊')}
}
}
4.使用插件
在main.js 中通过import 引入插件,并通过:Vue.use() 使用
/引入Vue
import Vue from 'vue'
import App from './App.vue'
import plugins from './plugins'
Vue.config.productionTip = false
Vue.use(plugins,1,2,3)
new Vue({
el:'#app',
render: h => h(App)
})
<h2 @click="showName">学校名称:{{name | mySlice}}</h2>
7. scoped样式
1.作用:我们写的组件样式最终会汇总到一起,那么就可能存在类名相同的问题。scoped样式让样式在局部生效,防止冲突。
2.写法:<style scoped>
<style scoped>
.demo{
background-color: skyblue;
}
</style>
8. 组件化编码流程
1.组件化编码流程:
(1) 实现静态组件:按照功能点拆分静态组件(命名不要与html元素冲突),实现静态页面效果。
(2) 实现动态组件:考虑好数据的存放位置,数据是一个组件在用,还是一些组件在用。
- 一个组件在用:放在组件自身即可。
- 一些组件在用:放在他们共同的父组件上(状态提升)。
(3) 实现交互:从绑定事件监听开始。
2.props 适用于
(1) 父组件 ==> 子组件 通信
(2) 子组件 ==> 父组件 通信(要求父先给子一个函数)
3.使用v-model 时要切记:v-model绑定的值不能是props传过来的值,因为props是不可以修改的!props传过来的若是对象类型的值,修改对象中的属性时Vue不会报错,但不推荐这样做!!!
9. webStorage
1.浏览器本地存储的存储大小一般支持5MB左右(不同浏览器可能还不一样)
2.浏览器端通过 Window.sessionStorage 和 Window.localStorage 属性来实现本地存储机制。
SessionStorage 存储的内容会随着浏览器窗口关闭而消失。LocalStorage 存储的内容,需要手动清除才会消失。
3.SessionStorage 和LocalStorage 可用API相同:
-
xxxxxStorage.setItem('key', 'value'); 接受一个键和值作为参数(字符串形式),会把键值对添加到存储中,如果键名存在,则更新其对应的值。 -
xxxxxStorage.getItem('person'); 接受一个键名作为参数,返回键名对应的值。 -
xxxxxStorage.removeItem('key'); 接受一个键名作为参数,并把该键名从存储中删除。 -
xxxxxStorage.clear() 会清空存储中的所有数据。
4.代码演示
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>localStorage</title>
</head>
<body>
<h2>localStorage</h2>
<button onclick="saveData()">点我保存一个数据</button>
<button onclick="readData()">点我读取一个数据</button>
<button onclick="deleteData()">点我删除一个数据</button>
<button onclick="deleteAllData()">点我清空一个数据</button>
<script type="text/javascript" >
let p = {name:'张三',age:18}
function saveData(){
localStorage.setItem('msg','hello!!!')
localStorage.setItem('msg2',666)
localStorage.setItem('person',JSON.stringify(p))
}
function readData(){
console.log(localStorage.getItem('msg'))
console.log(localStorage.getItem('msg2'))
const result = localStorage.getItem('person')
console.log(JSON.parse(result))
}
function deleteData(){
localStorage.removeItem('msg2')
}
function deleteAllData(){
localStorage.clear()
}
</script>
</body>
</html>
注意:
xxxxxStorage.getItem(xxx) 如果xxx对应的value获取不到,那么getItem的返回值是null。JSON.parse(null) 的结果依然是null。
|