工程化开发模式:基于构建工具(例如:webpack ) 的环境中开发 Vue。
基本介绍:
Vue CLI 是Vue官方提供的一个全局命令工具
可以帮助我们快速创建
一个开发Vue项目的标准化基础架子
。【集成了webpack配置】
好处:
使用步骤:
yarn global add @vue/cli
或者 npm i @vue/cli -g
vue --version
或者vue --V
vue create project-name
(项目名不能使用中文)yarn serve
或者 npm run serve
(命令不固定,找package.json)@vue/cli
模块包,卡主可以ctrl c 停止重新来yarn global add @vue/cli
# OR
npm install -g @vue/cli
Vue
命令版本,如果出现版本号就安装成功, 否则失败vue -V
**概要:**用Vue命令, 创建一个脚手架项目, 并启动webpack开发服务器
步骤:
项目名不能带大写字母, 中文和特殊符号
# vue create是命令, vuecli-demo是项目名
vue create 01-vuecli-demo
可以上下箭头选择, 回车确定, 弄错了ctrl+c从第1步来
cd 01-vuecli-demo
npm run serve # 或yarn serve
01-vuecli-demo
│─node_modules 第三包文件夹
├─public 放html文件的地方
│ ├─favicon.ico 网站图标
│ └─index.html index.html 模板文件 ③
├─src 源代码目录 → 以后写代码的文件夹
│ └─assets 静态资源目录 → 存放图片、字体等
│ └─components 组件目录 → 存放通用组件
│ └─App.vue App根组件 → 项目运行看到的内容就在这里编写 ②
│ └─main.js 入口文件 → 打包或运行,第一个执行的文件 ①
└─.gitignore git忽视文件
└─babel.config.js babel配置文件
└─jsconfig.json js配置文件
└─package.json 项目配置文件 → 包含项目名、版本号、scripts、依赖包等
└─README.md 项目说明文档
└─vue.config.js vue-cli配置文件
└─yarn.lock yarn锁文件,由yarn自动生成的,锁定安装版本
虽然脚手架中的文件有很多,但是重要的只有三个文件
其他文件的说明可以参考webpack详解和npm与包
01-vuecli-demo
复制一下名字改成02-vuecli-template
,开始自定义配置。vue.config.js
是一个可选的配置文件,用于在标准配置外添加自定义配置。@vue/cli-service
自动加载。module.exports = {
// 选项...
}
@vue/cli-service
提供的 defineConfig
帮手函数,以获得更好的类型提示。const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
// 选项
})
vue.config.js
中的 configureWebpack
选项提供一个对象,该对象将会被合并入最终的 webpack 配置。const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
//其他配置
configureWebpack: {
devServer: { // 自定义服务配置
open: true, // 自动打开浏览器
port: 3000 // 默认端口3000
}
}
})
这样的错误, 证明eslint发现你代码不严谨
vue.config.js
添加配置后重启即可const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
//其他配置
lintOnSave: false //关闭eslint检查
})
一个个组件
,每个组件有着自己独立的结构、样式、行为
。维护
,利于复用
→ 提升开发效率
。最上层
的组件,包裹所有普通小组件。局部注册:
只能在注册的组件内使用全局注册:
所有组件内都能使用组件使用方式:
当成html标签使用即可 <组件名>组件名>组件名规范:
大驼峰命名法, 如 HmHeader
技巧:
一般都用局部注册
,如果发现确实是通用组件
,再定义到全局
。使用的组件内
导入并注册HmHeader.vue
我是hm-header
HmMain.vue
我是hm-main
HmFooter.vue
App.vue
,在父组件中引入子组件使用
main.js
中进行全局注册Vue.component('组件名', 组件对象)
HmButton.vue
main.js
中进行全局注册import Vue from 'vue'
import App from './App.vue'
// 编写导入的代码,往代码的顶部编写(规范)
import HmButton from './components/HmButton'
Vue.config.productionTip = false
// 进行全局注册 → 在所有的组件范围内都能直接使用
// Vue.component(组件名,组件对象)
Vue.component('HmButton', HmButton)
new Vue({
render: h => h(App),
}).$mount('#app')
App.vue
中使用
XtxShortCut.vue
XtxHeaderNav.vue
XtxBanner.vue
XtxNewGoods.vue
新鲜好物
新鲜出炉 品质靠谱
XtxHotBrand.vue
热门品牌
国际经典 品质认证
XtxTopic.vue
XtxFooter.vue
/* 去除常见标签默认的 margin 和 padding */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
/* 设置网页统一的字体大小、行高、字体系列相关属性 */
body {
font: 16px/1.5 "Microsoft Yahei",
"Hiragino Sans GB", "Heiti SC", "WenQuanYi Micro Hei", sans-serif;
color: #333;
}
/* 去除列表默认样式 */
ul,
ol {
list-style: none;
}
/* 去除默认的倾斜效果 */
em,
i {
font-style: normal;
}
/* 去除a标签默认下划线,并设置默认文字颜色 */
a {
text-decoration: none;
color: #333;
}
/* 设置img的垂直对齐方式为居中对齐,去除img默认下间隙 */
img {
width: 100%;
height: 100%;
vertical-align: middle;
}
/* 去除input默认样式 */
input {
border: none;
outline: none;
color: #333;
}
h1,
h2,
h3,
h4,
h5,
h6 {
font-weight: 400;
}
/* 双伪元素清除法 */
.clearfix::before,
.clearfix::after {
content: "";
display: table;
}
.clearfix::after {
clear: both;
}
/* 公共的全局样式 */
.wrapper {
margin: 0 auto;
width: 1240px;
}
.title {
display: flex;
justify-content: space-between;
margin-top: 40px;
margin-bottom: 30px;
height: 42px;
}
.title .left {
display: flex;
align-items: flex-end;
}
.title .left h3 {
margin-right: 35px;
font-size: 30px;
}
.title .left p {
padding-bottom: 5px;
color: #A1A1A1;
}
.title .right {
line-height: 42px;
}
.title .right .more {
color: #A1A1A1;
}
.title .right .iconfont {
margin-left: 10px;
}
BaseBrandItem.vue
BaseGoodsItem.vue
KN95级莫兰迪色防护口罩
¥ 79
main.js
中全局注册import Vue from 'vue'
import App from './App.vue'
import './styles/base.css' // css 样式重置
import './styles/common.css' // 公共全局样式
import './assets/iconfont/iconfont.css' // 字体图标的样式
import BaseGoodsItem from './components/BaseGoodsItem'
import BaseBrandItem from './components/BaseBrandItem'
Vue.component('BaseGoodsItem', BaseGoodsItem)
Vue.component('BaseBrandItem', BaseBrandItem)
Vue.config.productionTip = false
new Vue({
render: h => h(App),
}).$mount('#app')
App.vue
组装子组件
默认情况:写在组件中的样式会 全局生效 → 因此很容易造成多个组件之间的样式冲突问题。
全局样式:
默认组件中的样式会作用到全局局部样式:
可以给组件加上 scoped
属性,可以让样式只作用于当前组件scoped原理
data-v-hash值
的属性[data-v-hash值]
的属性选择器
必须是当前组件的元素
, 才会有这个自定义属性, 才会被这个样式作用到scoped原理演示
Panel.vue
这里是子组件
App.vue
中使用子组件
这个是父组件
Panel.vue
样式加上scoped
这里是子组件
data
选项必须是一个函数
。目的是为了保证每个组件实例,维护独立
的一份数据对象。新执行
一次 data 函数,得到一个新对象
。data演示:
BaseCount.vue
{{ count }}
App.vue
使用子组件