Vue CLI 搭建项目

1 介绍

1) 什么是Vue-CLI

Vue CLI ( Command-Line Interface, 翻译为命令行界面 ) 是一个基于 Vue.js 进行快速开发的完整系统, 俗称Vue项目脚手架

CLI是一个全局安装的npm包, 提供了终端里的vue命令, 可以快速搭建一个新项目

2) 作用

Vue CLI是Vue.js的脚手架,用于自动生成vue.js+webpack的项目模板

2 安装与升级

1) 安装

可以使用下面任一命令安装Vue CLI

  1. npm install -g @vue/cli
  2. # OR
  3. yarn global add @vue/cli

安装之后,你就可以在命令行中访问 vue 命令。你可以通过简单运行 vue,看看是否展示出了一份所有可用命令的帮助信息,来验证它是否安装成功。

你还可以用这个命令来检查其版本是否正确:

  1. vue --version

2) 升级

如需升级全局的 Vue CLI 包,请运行:

  1. npm update -g @vue/cli
  2. # 或者
  3. yarn global upgrade --latest @vue/cli

3 创建项目

1) 使用脚手架创建项目

在根目录下, 运行vue create + 项目名称命令来创建一个新项目

  1. vue create hello-world
  2. # hello-world即为项目名称, 后面会生成该文件夹

选择一个默认预设值

这里选择Mannully select features, 手动配置
image.png

选择需要设置的配置项, 这里按照不同的项目需求进行设置 (或根据公司要求配置)

:::info Babel: 将ES6语法—>ES5
CSS Pre-processors: CSS预处理器(stylus)
Linter / Fprmatter: 代码 校验/格式化 ::: image.png
选择vue版本
image.png
选择Stylus作为CSS预处理器
image.png
In dedicated config files 把配置单独存放到不同的配置文件
image.png
是否将配置作为一个预设 一般: 否
image.png
到这里就创建成功了
image.png
image.png

2) 执行项目

执行cd hello-world命令, 进入到创建的hello-world文件中

或者直接用VScode打开创建的hello-world文件夹

image.png

  1. cd hello-world

再执行npm run serve命令, 项目就启动起来了
image.png
然后打开对应的访问地址http://localhost:8082/就可以看到创建的项目了
image.png

4 目录结构

1) 目录结构及主要文件

项目目录主要包括:

① node_modules文件夹

② public文件夹

  • favicon.ico 图标
  • index.html 整个项目的入口文件

③ src文件夹

  • assets文件夹
  • components文件夹 放置组件
    • HelloWorld.vue 默认创建的组件
  • App.vue Vue实例的单文件组件
  • main.js 挂载到#app上的Vue实例

④ 其他相关配置文件

  • package.json
  • ……

image.png

2) 启动流程

整个项目启动流程见下图:
未命名文件 (2).jpg

3) 框架清理

使用Vue CLI脚手架搭建的项目, 在使用时会产生一些项目用不到的示例,

在项目搭建过程前需要清除这些不需要的示例

主要是模板自己创建的HelloWorld.vue组件

:::tips

  1. 删除components文件夹下HelloWorld.vue组件

  2. App.vue中删除HelloWorld.vue组件的导入、挂载、引用和img标签

  3. 清除App.vue中的style样式 :::

5 基本示例

1) 创建组件

components文件夹下新建Demo.vue组件

定义Demo.vue组件, 包括组件模板、组件逻辑组件样式三部分

  1. <template>
  2. <div>我是demo组件内容</div>
  3. </template>
  4. <script>
  5. export default {
  6. name:'Demo',
  7. }
  8. </script>
  9. <style lang="stylus">
  10. </style>

2) 导入组件对象

App.vue中组件逻辑部分导入Demo.vue组件

  1. import Demo from './components/Demo.vue'

3) 挂载组件

App.vue中组件逻辑中设置components选项, 并添加组件名为Demo的组件

  1. export default {
  2. name: 'App',
  3. components: {
  4. Demo: Demo, //可缩写为Demo,
  5. },

4) 引用组件

App.vue中组件模板中, 引用Demo组件, 这里要注意单个根元素问题, 需外面包裹一个元素

  1. <template>
  2. <div id="app">
  3. <Demo></Demo>
  4. </div>
  5. </template>

6 父子组件通信

1) 父组件向子组件传值

① 在子组件模板中添加属性,发送数据

如添加msg自定义属性

  1. <template>
  2. <div id="app">
  3. <Demo msg="hello" msg2="a"></Demo>
  4. </div>
  5. </template>

② 在子组件中通过props,接收数据

示例

  1. <script>
  2. export default {
  3. name:'Demo',
  4. props:['msg'],
  5. }
  6. </script>

同样, 也可以给子组件传递父组件data中定义的数据

  1. <script>
  2. import Demo from './components/Demo.vue';
  3. export default {
  4. name: 'App',
  5. components: {
  6. Demo: Demo, //可缩写为Demo,
  7. },
  8. data(){
  9. return {
  10. a:'父组件的数据'
  11. }
  12. }
  13. };
  14. </script>
  1. <template>
  2. <div id="app">
  3. <Demo msg="hello" :msg2="a"></Demo>
  4. </div>
  5. </template>
  1. <script>
  2. export default {
  3. name:'Demo',
  4. props:['msg','msg1'],
  5. }
  6. </script>

这里就将父组件data中的数据传递给子组件了
image.png

2) 子组件向父组件传值

① 在子组件模板中绑定一个方法

  1. <template>
  2. <div @click="handleClick">我是demo组件内容</div>
  3. </template>

② 在方法中向父组件提交 (emit) 一个事件

  1. <script>
  2. export default {
  3. name: 'Demo',
  4. methods: {
  5. handleClick() {
  6. // 第一个参数为事件名, 第二个参数为传输的数据
  7. this.$emit('s2f',this.obj);
  8. },
  9. },
  10. data() {
  11. return {
  12. obj: { id: 1, name: 'xiaoming' },
  13. };
  14. },
  15. };
  16. </script>

③ 在子组件标签中监听事件 (绑定方法)

  1. <template>
  2. <div id="app">
  3. <Demo @s2f="handleSend"></Demo>
  4. </div>
  5. </template>

④ 在父组件中编写处理程序

  1. <script>
  2. import Demo from './components/Demo.vue';
  3. export default {
  4. name: 'App',
  5. components: {
  6. Demo: Demo, //可缩写为Demo,
  7. },
  8. methods:{
  9. //参数value即为传输过来的数据
  10. handleSend(value){
  11. console.log(value);
  12. }
  13. },
  14. };
  15. </script>

3) 交互

需求

实现将Demo.vue组件中的input输入框输入的内容添加到App.vue父组件中

设置Demo.vue子组件

  1. <template>
  2. <div>
  3. <button @click="handleClick">点击添加</button>
  4. <input type="text" v-model="msg"/>
  5. </div>
  6. </template>
  1. <script>
  2. export default {
  3. name: 'Demo',
  4. methods: {
  5. handleClick() {
  6. // 第一个参数为事件名, 第二个参数为传输的数据
  7. this.$emit('s2f', this.msg);
  8. },
  9. },
  10. data() {
  11. return {
  12. msg: '',
  13. };
  14. },
  15. };
  16. </script>

设置App.vue父组件

  1. <template>
  2. <div id="app">
  3. <Demo @s2f="handleSend"></Demo>
  4. </div>
  5. </template>
  1. <script>
  2. import Demo from './components/Demo.vue';
  3. export default {
  4. name: 'App',
  5. components: {
  6. Demo: Demo, //可缩写为Demo,
  7. },
  8. methods: {
  9. //参数value即为传输过来的数据
  10. handleSend(value) {
  11. this.msg = value;
  12. console.log(value);
  13. },
  14. },
  15. data() {
  16. return {
  17. msg: '',
  18. };
  19. },
  20. };
  21. </script>

效果实现

image.png