一个vue的简单例子

参考:https://blog.csdn.net/nsrainbow/article/details/80589476

一个好的教程:

一个vue的简单例子_html

首先创建一个空的文件夹:

mkdir learn-vue

cd learn-vue

 

然后新建一个index.html文件:

一个vue的简单例子_html_02

 

此时的结构:

一个vue的简单例子_html_03

 

添加vue.js的引用:

一个vue的简单例子_html_04

 

创建DOM组件:

一个vue的简单例子_html页面_05

 

创建js组件:

一个vue的简单例子_vue.js_06

 

完整的文件:

一个vue的简单例子_vue.js_07

 

浏览器访问index.html:

一个vue的简单例子_html_08

 

webpack登场:

webpack是一个js打包工具,使用webpack你可以在一个js文件中使用 import 或者 require 来引用另外一个js文件中定义的组件

不消说,这样你就可以把js组件分文件存放了。

创建package.json文件:

一个vue的简单例子_vue.js_09

一个vue的简单例子_html_10

 

安装webpack

npm i --save-dev webpack webpack-cli

 

安装完毕后,此时package.json的内容为:

一个vue的简单例子_bundle_11

 

一个vue的简单例子_bundle_12

多了一个node_modules核package-lock.json。

 

通过webpack就可以把多个js文件打包成一个js文件。

使用了webpack就可以使用import语句来导入别的js文件。

好处1:不需要将公共库的js引用写到页面上来了,比如vue的引用就不需要写到index.html页面上了。

好处2:可以将你的所有js脚本可以按模块来分文件存放了。

 

现在开始抽离index.html中的js部分到独立的js文件中

新建一个src文件夹,并在其中建立main.js。 并将index.html中的js语句移动到这个文件中,文件的内容为:

一个vue的简单例子_json_13

一个vue的简单例子_html页面_14

 

修改index.html中关于js的引用:

一个vue的简单例子_vue.js_15

 

此时再次访问index.html,还是得到相同的结果:

一个vue的简单例子_bundle_16

 

但从上面的过程看,似乎没有什么区别。

只是简单的将部分js代码放到单独的文件了。截止到此时,还没有使用到webpack。

 

创建webpack的配置文件:

一个vue的简单例子_html页面_17

一个vue的简单例子_json_18

 

创建dist目录:

一个vue的简单例子_vue.js_19

 

打包:

一个vue的简单例子_bundle_20

 

一个vue的简单例子_html页面_21

 

此时,main.js(入口文件)被打包为了bundle.js(出口文件)文件

现在,修改index.html的引用:

一个vue的简单例子_json_22

再次访问:

一个vue的简单例子_html_23

 

截止到这里,没有什么大的变化。

短暂的总结:(目前经历了三版)

一个vue的简单例子_bundle_24

 

第一版:全部集中在一个文件。

第二版:将js部分拆分到main.js中。

第三版:将js部分打包到bundle.js中。

 

截止到现在,vue.js还是通过script的形式引入到index.html中,接下来要改变这种方式。

 

首先去除index.html中对于vue.js的引用:

一个vue的简单例子_vue.js_25

 

问题是:我们的js脚本用到了Vue,但你现在去掉了vue.js的引用,岂不是要报错

现在我们要换一种方式。

首先将vue安装到本地:

npm install --save vue

 

package.json的内容:

一个vue的简单例子_html页面_26

 

此时node_modules中也多了vue目录。

 

然后在main.js中引用vue:

一个vue的简单例子_json_27

 

再次构建一次项目:

npx webpack

一个vue的简单例子_json_28

 

浏览器访问index.html:

一个vue的简单例子_vue.js_29

这是因为如果你直接写 import Vue from 'vue' 那么调用的是运行时的vue版本,这个版本不带模板解析包

我们之前在index.html页面上引用的也不是运行时版本。

 

修改main.js:

一个vue的简单例子_html_30

 

再次打包:

一个vue的简单例子_bundle_31

 

现在访问index.html就正常了。

 

一个vue的简单例子_html_32

 

单文件组件(SFC)

一个 .vue文件就是一个组件,它的结构由三部分组成:

一个vue的简单例子_vue.js_33

 

以下的结构是一个SFC文件的样子:

一个vue的简单例子_bundle_34

一个vue的简单例子_html_35

除了script元素外,template和style元素是可选的。也就是说,一个vue文件只需要script即可,template和style是可选的。

 

新建HelloVue组件

创建components目录,专门放置vue文件,作为组件的存放地。

一个vue的简单例子_vue.js_36

在src目录下创建components目录,因为它是属于源码的一部分。

 

创建HelloVue.vue组件:

一个vue的简单例子_html页面_37

这是文件的初始化样子。

将之前写在index.html中的 {{ message }} 部分放置到HelloVue.vue的template里面

将之前写在main.js中的new Vue()部分放置到HelloVue.vue的script里面。

一个vue的简单例子_bundle_38

 

使用组件之后,有以下不同:

1、不需要执行 new Vue 了,只需要用export default {...} 来定义组件即可

2、data属性变成一个方法了,该方法可以通过一串预处理过程得出一个json对象

此处我们没有预处理过程,所以直接返回对象。

3、没有<style>,由于我们的例子很简单,所以就省略了<style>元素

 

另外,还需要修改index.html:

一个vue的简单例子_html_39

去掉了{{ message }}

 

vue在启动时会注册各个组件,每个组件的注册名就是name属性定义的值。各个组件之间可以通过name来调用。

比如你定义了HelloVue组件,那么在另外一个组件的模板中就可以使用以下方式来调用。

一个vue的简单例子_html页面_40

 

注意:vue组件中,template组件不是必须的,因为我们可以通过另一种方式来填写template。

一个vue的简单例子_vue.js_41

template的部分被写到script里面了。

 

加载HelloVue组件

一个vue的简单例子_json_42

修改main.js:

一个vue的简单例子_bundle_43

 

解析vue文件:

因为webpack不认识vue,因此需要安装解释器,从而让webpack能认识vue。

npm i --save-dev vue-loader vue-template-compiler

 

安装之后,还要进行配置,这样在运行webpack的时候,它才会去使用这个解释器:

一个vue的简单例子_html页面_44

 

最后告诉webpack哪些文件需要用这个插件来解析

一个vue的简单例子_html页面_45

所有以vue结尾的文件都用这个vue-loader来解释。

 

进行打包:

npx webpack

然后在浏览器访问index.html

一个vue的简单例子_json_46

 

当前的结构为:

一个vue的简单例子_json_47

 

一个vue的简单例子_html_48

 

用App.vue进行页面布局

App.vue作为所有vue组件的根组件。

一个vue的简单例子_bundle_49

如果使用App.vue,你可以把页面的基本结构,写到App.vue的<template>标签中。main.js就单纯负责启动就行了

在src目录下建立App.vue文件:

一个vue的简单例子_json_50

 

然后修改main.js,让其只加载App.vue组件:

一个vue的简单例子_bundle_51

现在的结构:

一个vue的简单例子_html页面_52

一个vue的简单例子_bundle_53

 

访问index.html:

一个vue的简单例子_bundle_54

 

我们来看一个小区别:

当index.html为以下结构时:

一个vue的简单例子_html_55

如果App.vue的模板为:

一个vue的简单例子_html_56

其中<HelloVue>来自HelloVue.vue组件,模板为:

一个vue的简单例子_bundle_57

因此组装后:

<div id="app">

  <p>{{ message }}</p>

</div>

 

 

 

最终替换掉index.html中的占位部分

一个vue的简单例子_html_58

 

假设我们将App.vue中的模板改为:

一个vue的简单例子_html_59

组装后:

<p>{{ message }}</p>

 

替换掉index.html中的占位部分:

一个vue的简单例子_html页面_60

 

上面这些只是为了说明,index.html中的<div id="app"></div>只是一个占位符,最终会被替换。

 

注意:在组件文件中,只能出现一个根元素,不能出现多个。

比如:

一个vue的简单例子_json_61

这种写法是错的。

应该改为:

一个vue的简单例子_bundle_62

 

错误:

一个vue的简单例子_html_63

正确:

一个vue的简单例子_html_64

 

一个vue的简单例子_html页面_65

 

使用html-webpack-plugin自动插入脚本

一个vue的简单例子_json_66

这里的bundle.js是我们手动填写的,而且没有版本。

使用该插件之后,我们可以删除index.html中的script部分,之后在npx webpack后,会自动填入到index.html中。

首先去除index.html中的script部分:

一个vue的简单例子_json_67

 

安装插件

npm i --save-dev html-webpack-plugin

 

然后在配置文件中配置:

一个vue的简单例子_vue.js_68

 

打包

npx webpack

 

打包之后,会在dist目录多一个index.html文件:

一个vue的简单例子_vue.js_69

bundle.js自动插入,并且多了hash数字。

 

最后的结构:

一个vue的简单例子_json_70