Vue入门

1.前言

先聊一下前端开发模式的发展.

静态网页

  • 最初的网页以 HTML 为主,是纯静态的网页.网页是只读的,信息流只能从服务端到客户端单向流通,开发人员也只关心页面的样式和内容即可.

异步刷新,操作 DOM

  • 1995 年,网景工程师 Brendan Eich 花了 10 天时间设计了 JavaScript 语言.
    随着 javaScript 的诞生,我们可以操作页面的 DOM 元素及样式,页面有了一些动态的效果,但是依然是以 静态为主.
  • ajax 盛行:
    1.2005 年开始,ajax 逐渐被前端开发人员所重视,因为不用刷新页面就可以更新页面的数据和渲染效果.
    2.此时的开发人员不仅仅要编写 HTML 样式,还要懂 ajax 与后端交互,然后通过 js 操作 DOM 元素来实现页面动态效果.比较流行的框架如 jQuery 就是典型代表.

MVVM,关注模型和视图

  • M:即 Model,模型,包括书籍和一些基本操作
  • V:即 View,视图,页面渲染效果
  • VM:即 View Model,模型与视图的双向操作(无需开发人员干涉)
    在 MVVM 之前,开发人员从后端获取需要的数据模型,然后通过 DOM操作渲染到 View 中,而后当用户操作视图,我们还需要通过 DOM 获取 View 中的数据,然后同步到 Model 中.
    而 MVVM 中 VM 要做的事情就是把 DOM 操作完全封装起来,开发人员不用关心 Model 和 View 直接是如何相互影响的.
  • 只要我们 Model 发生了改变,View 上自然会表现出来
  • 当用户修改了 View,Model 中的数据也会跟着改变
    把开发人员从繁琐的 DOM 操作中解放出来,把关注点放在如何操作 Model 上.

2.认识 Vue

Vue是一套用于构建用户界面的渐进式框架,与其他大型框架不同的是,Vue 被设计为可以自底向上逐层应用,Vue 的核心库只关注视图层,不仅容易与上手,还便于与第三方库或既有项目整合,另一方面,当现代化工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动.

前端框架三巨头:Vue.js,React.js,Angular.js,Vue.js 以其轻量易用著称,Vue.js 和 React.js 发展速度最快

官网:https://cn.vuejs.org/

3.Node和NPM

前面说过,NPM是Node提供的模块管理工具,可以非常方便的下载安装很多前端框架,包括jquery,angularJS,VueJs.为了Vue学习方便,我们先安装Node及NPM工具

3.1.下载Node.js

下载地址:https://nodejs.org/zh-cn/download/


推荐下载LTS版本
安装完成以后,在控制台输入:

node -v

看到版本信息:


3.2.NPM

安装完成Node应该自带了NPM,在控制台输入 npm -v 查看:


npm 默认的仓库地址是在国外的网站,速度较慢,建议设置到淘宝镜像.但是切换镜像比较麻烦,推荐一开切换镜像的工具:nrm
首先安装nrm,这里 -g 代表全局安装

npm install nrm -g

然后通过 nrm ls 命令查看npm的仓库列表,带*的就是当前选中的镜像仓库:



通过nrm use taobao 来指定要使用的镜像源:

nrm use taobao

然后通过nrm test npm来测试速度

4.快速入门

新建项目 Java Enterprise
填入Project Name



在创建好的项目里的Terminal初始化NPM

npm init -y

运行结果



项目内会多出一个package.json文件,跟maven pom文件类似



然后安装vue.js
npm install vue --save #--save 本地安装 只应用到项目内

运行结果:



package.json内会多出vue



并且项目目录内也会多出node_modules/vue的文件夹

4.1Vue入门案例

HTML模板
在项目新建一个HTML
在HTML内引入Vue.js

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script src="node_modules/vue/dist/vue.js"></script>
</body>
</html>

在hello.html中加入一段简单的代码

<div id="app">
    <h1>xx 好用!</h1>
</div>

h1中要输出一句话:xx 好用!.前面的xx是要渲染的数据.

4.1.1.vue渲染

然后我们通过Vue进行渲染

<div id="app">
    <h1>{{name}} 好用!</h1>
</div>
<script src="node_modules/vue/dist/vue.js"></script>
<script>
    //创建vue实例
    const app = new Vue({
        el:"#app",   //element vue所操作的标签
        data:{
          name:"vue" //替换xxx数据
        }
    });
</script>
  • 首先啊通过new Vue()来创建Vue实例
  • 然后构造函数接收一个对象,对象中有一些属性 :
    • el:是element的缩写,通过id选中要渲染的页面元素,本例中是一个div
    • data:数据,数据是一个对象,里面有很多属性,都可以渲染到视图中
      • name:这里我们指定一个name属性
  • 页面中的h1元素中,我们通过{{name}}的方式,来渲染刚刚定义的name属性
    打开页面查看效果:



    更神奇的是当你修改name属性时,页面会跟着变化


4.1.2.双向绑定

对刚才的案例进行简单修改

<div id="app">
    <input type="text" v-model="num">
    <h1>
        {{name}} 好用!
        github star number:{{num}}
    </h1>
</div>
<script src="node_modules/vue/dist/vue.js"></script>
<script>
    const app = new Vue({
        el:"#app",   //element vue所操作的标签
        data:{
          name:"vue", //替换xxx数据
          num:999
        }
    });
</script>
  • 我们在data中添加新的属性:num
  • 在页面有一个input元素,通过v-model与num进行绑定.
  • 同时通过{{num}}在页面输出
    效果:



    我们可以看到,输入框的变化可以引起data中的num的变化,同时页面输出也跟着变化

  • input与num绑定,Input的value值变化,影响到了data中的num值

4.1.3.事件绑定

添加一个button标签

    <input type="text" v-model="num"><button @click="num++">+</button>
  • @click:点击事件
  • num++:点击后的运行逻辑
    运行效果:


4.2Vue实例

4.2.1创建Vue实例

每个Vue应用都是通过用Vue函数创建一个新的Vue实例开始的:

const v = new Vue({
    //...
})

在构造函数中传入一个对象,并且在对象中声明各种Vue需要的数据和方法,包括:

  • el
  • data
  • methods
  • ...

4.2.2.模板或元素

每个Vue实例都需要关联一段Html模板,Vue会基于此模板进行视图渲染.
我们可以通过el属性来指定.
例如上面的 4.1.1.vue渲染

4.2.3.方法

Vue实例中除了可以定义data属性,也可以定义方法,并且在vue的作业范围内使用

html:

<div id="app">
    <button @click="handleClick()">点我</button>
</div>

js:

const app = new Vue({
    el:"#app",   //element vue所操作的标签
    data:{
    },
    methods:{
        handleClick(){
            console.log("hello!");
        }
    }
});

4.2.4.生命周期钩子

生命周期
每个vue实例在被创建时都要经过一系列的初始化过程:创建实例,装载模板,渲染模板等等,Vue为生命周期中的每个状态都设置了钩子函数(监听函数).每当Vue实例处于不同的生命周期时,对应的函数就会被处罚调用.
生命周期:


钩子函数
例如:created代表Vue实例创建后:
我们可以在Vue中定义一个created函数,代表这个时期的构造函数:
html

<div id="app">
    {hello}
</div>

js:

let vm = new Vue({
    el:"#app",
    data:{
        hello:"占位值"
    },
    created(){
        //为了看出不一样 这里延时一下
        setTimeout(()=>this.hello = "hello",1000);
    }
})

结果:


this
我们可以看下在Vue内部的this变量是谁,我们在created的时候,打印出 this

let vm = new Vue({
    el:"#app",
    data:{
        hello:""
    },
    created(){
        setTimeout(() => this.hello = "hello",1000);
        console.log(this);
    }
})

控制台的输出:



总结: this 就是当前的Vue实例,在Vue对象内部,必须使用this才能访问到Vue定义的data内属性,方法等.

5.指令

指令(Directives)是带有v-前缀的特殊属性,例如我们在入门案例中的v-model,代表双向绑定.

5.1.插值表达式

5.1.1.花括号

格式:

{{表达式}}

说明:

  • 该表达式支持js语法,可以调用js内置函数(必须有返回值)
  • 表达式必须有返回结果,例如 1 + 1,没有结果的表达式不允许使用,例如: let a = 1 + 1;
  • 可以直接获取Vue实例中定义的数据或函数
    示例:
    HTML:
<div id="app">{{hello}}</div>

JS:

const app = new Vue({
    el:"#app",   //element vue所操作的标签
    data:{
        hello:"hello word", //替换xxx数据
    }
});

5.1.2. 插值闪烁

使用{{}}方式存在网速较慢时会出现问题.在数据未加载完成时,页面会显示出原始的插值表达式{{hello}}
将网速调慢一些,然后试试刚才的案例:
刷新界面



需要等js加载完毕才显示渲染值


5.2.v-text和v-html

使用v-text和v-html指令来代替{{}}
说明:

  • v-text:将数据输出到元素内部,如果输出
  • v-hrml:将数据输出到元素内部,如果输出的数据有HTML代码,会被渲染
    示例:
    HTML
<div id="app">
    v-text:<span v-text="hello"></span><br/>
    v-html:<span v-html="hello"></span>
</div>

JS

let vm = new Vue({
    el:"#app",
    data:{
    hello:"<font color='blue'>hello world</font>"
    },
});

效果:



并且不会出现插值闪烁,当没有数据时,会显示空白

5.3.v-model

刚才的v-text和v-html可以看做是单向绑定,数据影响了视图渲染,但是反过来就不行了,v-model是双向绑定,视图(View)和模型(Model)之间会互相影响.
既然是双向绑定,一定是在视图中可以修改数据,这样就限定了试图的元素类型.目前v-model的可使用元素有:

  • input
  • select
  • textarea
  • checkbox
  • radio
  • components(vue中的自定义组件)
    基本上除了最后一项,其他都是表单的输入项.
    示例:
    HTML
<h1>哪种语言是世界上最好的语言?</h1>
<input type="checkbox" v-model="language" value="Java"/>Java<br/>
<input type="checkbox" v-model="language" value="PHP"/>PHP<br/>
<input type="checkbox" v-model="language" value="Python"/>Python<br/>
<h1>
您以选择下列课程:{{language.join(",")}}
</h1>

JS

let vm = new Vue({
    el:"#app",
    data:{
        hello:"<font color='blue'>hello world</font>",
        language:['Java','PHP']
    },
});

效果



当去取消或选中的时候language的值也会相应改变


未完待续!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。