说明
Vue 脚手架是一套用于构建 Vue.js 单页应用 (SPA) 的工具链,它可以帮助我们快速搭建 Vue.js 项目架构。Vue 脚手架提供了一系列的命令行工具,可以轻松地创建、开发、构建和测试 Vue.js 应用。其中最常用的 Vue 脚手架工具是 Vue CLI,它是官方提供的一个用于快速搭建基于 Vue.js 的开发环境和项目结构的命令行工具。通过 Vue CLI,我们可以便捷地创建一个新的 Vue.js 项目,并配置 webpack、babel、ESLint、jest 等构建工具和测试框架。
- Vue脚手架是Vue官方提交的标准化的开发工具(开发平台)
- 文档地址
- 最新的版本是:4.x
- 拓展:
Vue(1.x,2.x,3.x) ---------核心技术版本
Vue CLI(1.x,2.x,3.x,4.x)--------平台版本
CLI的全称为:command line interface (命令行接口工具)
具体步骤
- 为防止下载缓慢请配置 npm 淘宝镜像:
npm config set registry https://registry.npm.taobao.org
- 第一步(仅第一次执行)全局安装 @vue/cli
npm install -g @vue/cli
- 第二步:切换到你要创建项目的目录,然后使用命令创建项目
vue create xxxx
- 第三步:启动项目
npm run serve
具体步骤如下:
项目结构
├── 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:包版本控制文件
项目运行的过程
render函数
-
vue.js与vue.runtime.xxx.js的区别:
(1).vue.js是完整版的Vue,包含:核心功能+模板解析器。
(2).vue.runtime.xxx.js是运行版的Vue,只包含:核心功能;没有模板解析器。 -
因为vue.runtime.xxx.js没有模板解析器,所以不能使用template配置项,需要使用render函数接收到的createElement函数去指定具体内容。
修改默认配置
- Vue 脚手架隐藏了所有 webpack 相关的配置,若想查看具体的 webpakc 配置,请执行:
vue inspect > output.js
- 使用vue.config.js可以对脚手架进行个性化定制,详情见:https://cli.vuejs.org/zh
- vue.config.js文件内写好的配置和webpack里面已经写好的配置合并,并且以这个配置为主,替换掉wenpack里面默认的配置,这样很巧妙的不会对脚手架里面已经配置好的核心文件造成破坏。
- vue.config.js代码如下
module.exports = {
pages: {
index: {
//入口
entry: 'src/main.js',
},
},
lintOnSave:false, //关闭语法检查
}
ref属性
- 作用:被用来给元素或子组件注册引用信息(id的替代者)(用于给节点打标识)
- 应用在html标签上获取的是真实DOM元素,应用在组件标签上是组件实例对象(vc)
- 使用方式:
- 打标识:
<h1 ref="xxx">.....</h1>
或<School ref="xxx"></School>
- 获取:
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>
//引入School组件
import School from './components/School'
export default {
name:'App',
components:{School},
data() {
return {
msg:'欢迎学习Vue!'
}
},
methods: {
showDOM(){
console.log(this.$refs.title) //真实DOM元素
console.log(this.$refs.btn) //真实DOM元素
console.log(this.$refs.sch) //School组件的实例对象(vc)
}
},
}
</script>
props属性
-
功能:让组件接收外部传过来的数据
-
传递数据:
<Demo name="xxx"/>
-
接收数据:
-
第一种方式(只接收):
props:['name']
-
第二种方式(限制类型):
props:{name:String}
-
第三种方式(限制类型、限制必要性、指定默认值):
props:{ name:{ type:String, //类型 required:true, //必要性 default:'某某某' //默认值 } }
-
-
备注:props是只读的,Vue底层会监测你对props的修改,如果进行了修改,就会发出警告,若业务需求确实需要修改,那么请复制props的内容到data中一份,然后去修改data中的数据。
mixin混入
-
功能:可以把多个组件共用的配置提取成一个混入对象
-
使用方式:
第一步定义混合:
{ data(){....}, methods:{....} .... }
-
mixin.js文件
export const hunhe = { methods: { showName(){ alert(this.name) } }, mounted() { console.log('你好啊!') }, } export const hunhe2 = { data() { return { x:100, y:200 } }, }
第二步使用混入:
1. 全局混入:
Vue.mixin(xxx)
main.js文件
//引入Vue import Vue from 'vue' //引入App import App from './App.vue' //引入混合 import {hunhe,hunhe2} from './mixin' //关闭Vue的生产提示 Vue.config.productionTip = false //全局使用混入 Vue.mixin(hunhe) Vue.mixin(hunhe2) //创建vm new Vue({ el:'#app', render: h => h(App) })
2. 局部混入:
mixins:['xxx']
<template> <div> <h2 @click="showName">学校名称:{{name}}</h2> <h2>学校地址:{{address}}</h2> </div> </template> <script> //引入混合 // import {hunhe,hunhe2} from '../mixin' export default { name:'School', data() { return { name:'XXX', address:'hangzhou', x:123 } }, //使用混合 // mixins:[hunhe,hunhe2], } </script>
-
注意:如果混合文件和当前页面文件配置冲突,以当前页面配置为主(比如data中的数据,methods中的方法等)。但是生命周期钩子函数例外,不管是写在混合文件还是写在当前文件,都会执行到。
插件
-
功能:用于增强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 }
-
使用插件:
Vue.use()
-
例子:
第一步: 在src中创建一个plugin.js插件文件,如下:export default { //是一个对象,一个包含install方法的对象,install的第一个参数是Vue构造函数。 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原型上添加一个方法(vm:Vue实例对象和vc:组件实例对象就都能用了) Vue.prototype.hello = ()=>{alert('你好啊')} } }
第二步:在main.js中引入插件,如下:
//引入Vue import Vue from 'vue' //引入App import App from './App.vue' //引入插件 import plugins from './plugins' //关闭Vue的生产提示 Vue.config.productionTip = false //应用(使用)插件,通过Vue.use()应用插件 Vue.use(plugins,1,2,3) //创建vm new Vue({ el:'#app', render: h => h(App) })
第三步:在页面中使用插件
<template>
<div>
<!-- 使用全局过滤器 -->
<h2>学校名称:{{name | mySlice}}</h2>
<h2>学校地址:{{address}}</h2>
<!-- vc获取Vue原型上面的方法-->
<button @click="test">点我测试一个hello方法</button>
<!-- 使用全局自定义指令 -->
<input type="text" v-fbind:value="name">
</div>
</template>
<script>
export default {
name:'School',
data() {
return {
name:'XXX123456',
address:'hangzhou',
}
},
methods: {
test(){
this.hello()
}
},
}
</script>
scoped样式
- 作用:让样式在局部生效,防止冲突。
- 写法:
<style scoped>
安装 less
- 先查看一下项目对应的webpack的版本
- 再查看一下目前webpack和less-loader都有哪些版本
- 上述项目中webpack的版本是4.x。故而less-loader,不可以直接安装(比如:npm i less-loader),会报语法错误,直接安装的话安装的是最新版本的,比如8.x或者9.x。这两个版本都是配合webpack5.x使用的。建议安装7.x版本的less-loader配合4.x版本的webpack一起使用。(npm i less-loader@7)