前端框架之Vue.js 库的使用

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介:

vue.js简介

Vue.js是前端三大新框架:Angular.js、React.js、Vue.js之一,Vue.js目前的使用和关注程度在三大框架中稍微胜出,并且它的热度还在递增。

Vue.js可以作为一个js库来使用,也可以用它全套的工具来构建系统界面,这些可以根据项目的需要灵活选择,所以说,Vue.js是一套构建用户界面的渐进式框架。

Vue的核心库只关注视图层,Vue的目标是通过尽可能简单的 API 实现响应的数据绑定,在这一点上Vue.js类似于后台的模板语言。

Vue也可以将界面拆分成一个个的组件,通过组件来构建界面,然后用自动化工具来生成单页面(SPA - single page application)系统。

Vue.js使用文档及下载Vue.js

Vue.js使用文档已经写的很完备和详细了,通过以下地址可以查看: https://cn.vuejs.org/v2/guide/

vue.js如果当成一个库来使用,可以通过下面地址下载: https://cn.vuejs.org/v2/guide/installation.html

Vue实例

每个 Vue 应用都是通过实例化一个新的 Vue对象开始的:


   
   
  1. window.onload = function(){
  2. var vm = new Vue({
  3. el:'#app',
  4. data:{message:'hello world!'}
  5. });
  6. }
  7. ......
  8. <div id="app">{{ message }} </div>

其中,el属性对应一个标签,当vue对象创建后,这个标签内的区域就被vue对象接管,在这个区域内就可以使用vue对象中定义的属性和方法。

数据与方法

当一个 Vue 实例被创建时,它向 Vue 的响应式系统中加入了其data对象中能找到的所有的属性。当这些属性的值发生改变时,视图将会产生“响应”,即匹配更新为新的值。还可以在Vue实例中定义方法,通过方法来改变实例中data对象中的数据,数据改变了,视图中的数据也改变。



   
   
  1. window.onload = function(){
  2. var vm = new Vue({
  3. el:'#app',
  4. data:{message:'hello world!'},
  5. methods:{
  6. fnChangeMsg:function(){
  7. this.message = 'hello Vue.js!';
  8. }
  9. }
  10. });
  11. }
  12. ......
  13. <div id="app">
  14. <p>{{ message }} </p>
  15. <button @click="fnChangeMsg">改变数据和视图 </button>
  16. </div>

Vue.js模板语法

模板语法指的是如何将数据放入html中,Vue.js使用了基于 HTML的模板语法,允许开发者声明式地将DOM绑定至底层 Vue 实例的数据。所有 Vue.js的模板都是合法的 HTML ,所以能被遵循规范的浏览器和 HTML 解析器解析。

插入值

数据绑定最常见的形式就是使用“Mustache”语法 (双大括号) 的文本插值:

<span>Message: {{ msg }}</span>

如果是标签的属性要使用值,就不能使用“Mustache”语法,需要写成使用v-bind指令:

<a v-bind:href="url" v-bind:title='tip'>百度网</a>
插入的值当中还可以写表达式:


   
   
  1. {{ number + 1 }}
  2. {{ ok ? 'YES' : 'NO' }}
  3. {{ message.split('').reverse().join('') }}
  4. <a v-bind:href="url">链接文字 </a>

指令

指令 (Directives) 是带有“v-”前缀的特殊属性。指令属性的值预期是单个JavaScript表达式,指令的职责是,当表达式的值改变时,将其产生的连带影响,响应式地作用于DOM。常见的指令有v-bind、v-if、v-on。



   
   
  1. <!-- 根据ok的布尔值来插入/移除 <p> 元素 -->
  2. <p v-if="ok">是否显示这一段 </p>
  3. <!-- 监听按钮的click事件来执行fnChangeMsg方法 -->
  4. <button v-on:click="fnChangeMsg">按钮 </button>

缩写

v-bind和v-on事件这两个指令会经常用,所以有简写方式:



   
   
  1. <!-- 完整语法 -->
  2. <a v-bind:href="url">... </a>
  3. <!-- 缩写 -->
  4. <a :href="url">... </a>
  5. <!-- 完整语法 -->
  6. <button v-on:click="fnChangeMsg">按钮 </button>
  7. <!-- 缩写 -->
  8. <button @click="fnChangeMsg">按钮 </button>


Class 与 Style 绑定

使用v-bind指令来设置元素的class属性或者sytle属性,它们的属性值可以是表达式,vue.js在这一块做了增强,表达式结果除了是字符串之外,还可以是对象或者数组。


Class绑定-对象语法

可以给v-bind:class传一个对象,以动态的切换class
<div class="static" v-bind:class="{active:isActive,'text-danger':hasError }"></div>
data属性值如下:


   
   
  1. data: {
  2. isActive: true,
  3. hasError: false
  4. }

最终渲染的效果:

<div class="static active"></div>

也可以给v-bind:class传一个对象引用

<div v-bind:class="classObject"></div>

data属性值可以写成:



   
   
  1. data: {
  2. classObject: {
  3. active: true,
  4. 'text-danger': false
  5. }
  6. }

Class绑定-数组语法

可以给v-bind:class传一个数组,以应用一个 class 列表



   
   
  1. <div v-bind:class="[activeClass, errorClass]"> </div>
  2. ......
  3. data: {
  4. activeClass: 'active',
  5. errorClass: 'text-danger'
  6. }

最终渲染为

<div class="active text-danger"></div>

如果你也想根据条件切换列表中的 class,可以用三元表达式:

<div v-bind:class="[isActive ? activeClass : '', errorClass]"></div>

style绑定

    同class 绑定两种方式, 但是应用较少,不列举出来了.....略过....


条件渲染

通过条件指令可以控制元素的创建(显示)或者销毁(隐藏),常用的条件指令如下:

v-if可以控制元素的创建或者销毁

<h1 v-if="ok">Yes</h1>
v-else指令来表示 v-if 的“else 块”,v-else 元素必须紧跟在带 v-if 或者 v-else-if 的元素的后面,否则它将不会被识别。


   
   
  1. <div v-if="Math.random() > 0.5">
  2. Now you see me
  3. </div>
  4. <div v-else>
  5. Now you don't
  6. </div>

v-else-if,顾名思义,充当 v-if 的“else-if 块”,可以连续使用:



   
   
  1. <div v-if="type === 'A'">
  2. A
  3. </div>
  4. <div v-else-if="type === 'B'">
  5. B
  6. </div>
  7. <div v-else-if="type === 'C'">
  8. C
  9. </div>
  10. <div v-else>
  11. Not A/B/C
  12. </div>

v-show 是一个用于根据条件展示元素的指令。用法和v-if大致一样,但是它不支持v-else,它和v-if的区别是,它制作元素样式的显示和隐藏,元素一直是存在的:

<h1 v-show="ok">Hello!</h1>

列表渲染

通过v-for指令可以将一组数据渲染到页面中,数据可以是数组或者对象,v-for 指令需要使用 item in items 形式的特殊语法,items 是源数据数组并且 item 是数组元素迭代的别名。

遍历数组



   
   
  1. <ul id="example-1">
  2. <li v-for="item in items">
  3. {{ item}}
  4. </li>
  5. </ul>
  6. //vue对象创建如下:
  7. var example1 = new Vue({
  8. el: '#example-1',
  9. data: {
  10. items: ['foo','bar']
  11. }
  12. })

如果想加上索引值,可以加上第二个参数:



   
   
  1. <ul id="example-2">
  2. <li v-for="(item, index) in items">
  3. {{ index }} - {{ item.message }}
  4. </li>
  5. </ul>

事件处理

事件绑定方法

可以用 v-on 指令监听 DOM 事件,并在触发时运行一些 JavaScript 代码,事件的处理,简单的逻辑可以写在指令中,复杂的需要在vue对象的methods属性中指定处理函数。



    
    
  1. <div id="example-1">
  2. <!-- 在指令中写处理逻辑 -->
  3. <button v-on:click="counter += 1">Add 1 </button>
  4. <p>The button above has been clicked {{ counter }} times. </p>
  5. </div>
  6. ......
  7. var example1 = new Vue({
  8. el: '#example-1',
  9. data: {
  10. counter: 0
  11. }
  12. })
methods属性中指定处理函数:


    
    
  1. <div id="example-2">
  2. <!-- greet 是在下面定义的方法名 -->
  3. <button v-on:click="greet">Greet </button>
  4. </div>
  5. ......
  6. var example2 = new Vue({
  7. el: '#example-2',
  8. data: {
  9. name: 'Vue.js'
  10. },
  11. // 在 `methods` 对象中定义方法
  12. methods: {
  13. greet: function () {
  14. // `this` 在方法里指向当前 Vue 实例
  15. alert('Hello ' + this.name + '!')
  16. }
  17. }
  18. })

事件修饰符

实际开发中,事件绑定有时候牵涉到阻止事件冒泡以及阻止默认行为,在vue.js可以加上事件修饰符



    
    
  1. <!-- 阻止单击事件继续传播 -->
  2. <a v-on:click.stop="doThis"> </a>
  3. <!-- 提交事件不再重载页面 -->
  4. <form v-on:submit.prevent="onSubmit"> </form>
  5. <!-- 修饰符可以串联 -->
  6. <a v-on:click.stop.prevent="doThat"> </a>
  7. <!-- 只有修饰符 -->
  8. <form v-on:submit.prevent> </form>

表单输入绑定

可以用 v-model 指令在表单 <input> 及 <textarea> 元素上创建双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素

单行文本框


   
   
  1. <input v-model="message" placeholder="edit me">
  2. <p>Message is: {{ message }} </p>

多行文本框



   
   
  1. <span>Multiline message is: </span>
  2. <p>{{ message }} </p>
  3. <textarea v-model="message" placeholder="add multiple lines"> </textarea>

复选框

单个复选框,绑定到布尔值:



   
   
  1. <input type="checkbox" id="checkbox" v-model="checked">
  2. <label for="checkbox">{{ checked }} </label>
多个复选框,绑定到同一个数组:


   
   
  1. <div id='example-3'>
  2. <input type="checkbox" id="jack" value="Jack" v-model="checkedNames">
  3. <label for="jack">Jack </label>
  4. <input type="checkbox" id="john" value="John" v-model="checkedNames">
  5. <label for="john">John </label>
  6. <input type="checkbox" id="mike" value="Mike" v-model="checkedNames">
  7. <label for="mike">Mike </label>
  8. <br>
  9. <span>Checked names: {{ checkedNames }} </span>
  10. </div>
  11. ......
  12. new Vue({
  13. el: '#example-3',
  14. data: {
  15. checkedNames: []
  16. }
  17. })

单选框



   
   
  1. <div id="example-4">
  2. <input type="radio" id="one" value="One" v-model="picked">
  3. <label for="one">One </label>
  4. <br>
  5. <input type="radio" id="two" value="Two" v-model="picked">
  6. <label for="two">Two </label>
  7. <br>
  8. <span>Picked: {{ picked }} </span>
  9. </div>
  10. ......
  11. new Vue({
  12. el: '#example-4',
  13. data: {
  14. picked: ''
  15. }
  16. })

下拉框



   
   
  1. <div id="example-5">
  2. <select v-model="selected">
  3. <option disabled value="">请选择 </option>
  4. <option>A </option>
  5. <option>B </option>
  6. <option>C </option>
  7. </select>
  8. <span>Selected: {{ selected }} </span>
  9. </div>
  10. ......
  11. new Vue({
  12. el: '...',
  13. data: {
  14. selected:''
  15. }
  16. })

计算属性和侦听属性

计算属性

模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的。在模板中放入太多的逻辑会让模板过重且难以维护。例如:


   
   
  1. <div id="example">
  2. {{ message.split('').reverse().join('') }}
  3. </div>

这个表达式的功能是将message字符串进行反转,这种带有复杂逻辑的表达式,我们可以使用计算属性:



   
   
  1. <div id="example">
  2. <p>Original message: "{{ message }}" </p>
  3. <p>Computed reversed message: "{{ reversedMessage }}" </p>
  4. </div>
  5. ......
  6. var vm = new Vue({
  7. el: '#example',
  8. data: {
  9. message: 'Hello'
  10. },
  11. computed: {
  12. // 计算属性的 getter
  13. reversedMessage: function () {
  14. // `this` 指向 vm 实例
  15. return this.message.split('').reverse().join('')
  16. }
  17. }
  18. })

侦听属性

侦听属性的作用是侦听某属性值的变化,从而做相应的操作,侦听属性是一个对象,它的键是要监听的对象或者变量,值一般是函数,当你侦听的元素发生变化时,需要执行的函数,这个函数有两个形参,第一个是当前值,第二个是变化后的值。



   
   
  1. window.onload = function(){
  2. var vm = new Vue({
  3. el:'#app',
  4. data:{
  5. iNum:1
  6. },
  7. watch:{
  8. iNum:function(newval,oldval){
  9. console.log(newval + ' | ' + oldval)
  10. }
  11. },
  12. methods:{
  13. fnAdd:function(){
  14. this.iNum += 1;
  15. }
  16. }
  17. });
  18. }

过滤器

Vue.js允许你自定义过滤器,可被用于一些常见的文本格式化。过滤器可以用在两个地方:双花括号插值和 v-bind 表达式


   
   
  1. <!-- 在双花括号中 -->
  2. {{ prize | RMB }}
  3. <!-- 在v-bind中 -->
  4. <div v-bind:id="rawId | formatId"> </div>

过滤器实际上是一个函数,可以在一个组件的选项中定义组件内部过滤器:



   
   
  1. filters:{
  2. RMB:function(value){
  3. if(value=='')
  4. {
  5. return;
  6. }
  7. return '¥ '+value;
  8. }
  9. }

或者在创建 Vue 实例之前全局定义过滤器:



   
   
  1. Vue.filter('Yuan',function(value){
  2. if(value=='')
  3. {
  4. return;
  5. }
  6. return value+'元';
  7. });
此时过滤器'RMB'只能在定义它的对象接管标签内使用,而'Yuan'可以全局使用


实例生命周期

每个Vue实例在被创建时都要经过一系列的初始化过程——例如,需要设置数据监听、编译模板、将实例挂载到DOM并在数据变化时更新 DOM 等。同时在这个过程中会自动运行一些叫做生命周期钩子的函数,我们可以使用这些函数,在实例的不同阶段加上我们需要的代码,实现特定的功能。

beforeCreate

在实例初始化之后,数据观测 (data observer) 和 event/watcher 事件配置之前被调用。

created

在实例创建完成后被立即调用。在这一步,实例已完成以下的配置:数据观测 (data observer),属性和方法的运算,watch/event 事件回调。然而,挂载阶段还没开始

beforeMount

在挂载开始之前被调用:相关的 render 函数首次被调用。

mounted

实例挂载到dom之后被调用,可以当成是vue对象的ready方法来使用,一般用它来做dom的初始化操作。

beforeUpdate

数据发生变化前调用

updated

数据发生变化后调用



数据交互

vue.js没有集成ajax功能,要使用ajax功能,可以使用vue官方推荐的axios.js库来做ajax的交互。 axios库的下载地址:https://github.com/axios/axios/releases

axios完整写法:



   
   
  1. axios({
  2. method: 'post',
  3. url: '/user/12345',
  4. data: {
  5. firstName: 'Fred',
  6. lastName: 'Flintstone'
  7. }
  8. });
axios请求的写法也写成get方式后post方式

执行get请求:



   
   
  1. // 为给定 ID 的 user 创建请求
  2. // then是请求成功时的响应,catch是请求失败时的响应
  3. axios.get('/user?ID=12345')
  4. .then(function (response) {
  5. console.log(response);
  6. })
  7. .catch(function (error) {
  8. console.log(error);
  9. });
  10. // 可选地,上面的请求可以这样做
  11. axios.get('/user', {
  12. params: {
  13. ID: 12345
  14. }
  15. })
  16. .then(function (response) {
  17. console.log(response);
  18. })
  19. .catch(function (error) {
  20. console.log(error);
  21. });

执行post请求



   
   
  1. axios.post('/user', {
  2. firstName: 'Fred',
  3. lastName: 'Flintstone'
  4. })
  5. .then(function (response) {
  6. console.log(response);
  7. })
  8. .catch(function (error) {
  9. console.log(error);
  10. });

ES6语法

ES6是JavaScript语言的新版本,它也可以叫做ES2015,之前学习的JavaScript属于ES5,ES6在它的基础上增加了一些语法,ES6是未来JavaScript的趋势,而且vue组件开发中会使用很多的ES6的语法,所以掌握这些常用的ES6语法是必须的。

变量声明let和const

let和const是新增的声明变量的开头的关键字,在这之前,变量声明是用var关键字,这两个关键字和var的区别是,它们声明的变量没有预解析,let和const的区别是,let声明的是一般变量,const申明的常量,不可修改。



   
   
  1. alert(iNum01) // 弹出undefined
  2. // alert(iNum02); 报错,let关键字定义变量没有变量预解析
  3. // alert(iNum03); 报错,const关键字定义变量没有变量预解析
  4. var iNum01 = 6;
  5. // 使用let关键字定义变量
  6. let iNum02 = 12;
  7. // 使用const关键字定义变量
  8. const iNum03 = 24;
  9. alert(iNum01); // 弹出6
  10. alert(iNum02); // 弹出12
  11. alert(iNum03); // 弹出24
  12. iNum01 = 7;
  13. iNum02 = 13;
  14. //iNum03 = 25; // 报错,const定义的变量不可修改,const定义的变量是常量
  15. alert(iNum01)

箭头函数

可以把箭头函数理解成匿名函数的第二种写法,箭头函数的作用是可以在对象中绑定this,解决了JavaScript中this指定混乱的问题。



   
   
  1. // 定义函数的一般方式
  2. /*
  3. function fnRs(a,b){
  4. var rs = a + b;
  5. alert(rs);
  6. }
  7. fnRs(1,2);
  8. */
  9. // 通过匿名函数赋值来定义函数
  10. /*
  11. var fnRs = function(a,b){
  12. var rs = a + b;
  13. alert(rs);
  14. }
  15. fnRs(1,2);
  16. */
  17. // 通过箭头函数的写法定义
  18. var fnRs = (a,b)=>{
  19. var rs = a + b;
  20. alert(rs);
  21. }
  22. // fnRs(1,2);
  23. // 一个参数可以省略小括号
  24. var fnRs2 = a =>{
  25. alert(a);
  26. }
  27. fnRs2('haha!');
  28. // 箭头函数的作用,可以绑定对象中的this
  29. var person = {
  30. name:'tom',
  31. age:18,
  32. showName:function(){
  33. setTimeout(()=>{
  34. alert(this.name);
  35. },1000)
  36. }
  37. }
  38. person.showName();

模块导入import和导出export

javascript之前是没有模块的功能的,之前做js模块化开发,是用的一些js库来模拟实现的,在ES6中加入了模块的功能,和python语言一样,python中一个文件就是一个模块,ES6中,一个js文件就是一个模块,不同的是,js文件中需要先导出(export)后,才能被其他js文件导入(import)



   
   
  1. // model.js文件中导出
  2. var person = {name:'tom',age:18}
  3. export default {person}
  4. // index.js文件夹中导入
  5. import person from 'js/model.js'
  6. // index.js中使用模块
  7. person.name
  8. person.age
  9. /*
  10. 上面导出时使用了default关键字,如果不使用这个关键字,导入时需要加大括号:
  11. import {person} from 'js/model.js'
  12. */

对象的简写

javascript对象在ES6中可以做一些简写形式,了解这些简写形式,才能方便我们读懂一些在javascript代码中简写的对象。



   
   
  1. let name = '李思';
  2. let age = 18;
  3. /*
  4. var person = {
  5. name:name,
  6. age:age,
  7. showname:function(){
  8. alert(this.name);
  9. },
  10. showage:function(){
  11. alert(this.age);
  12. }
  13. }
  14. */
  15. // 简写成下面的形式
  16. var person = {
  17. name,
  18. age,
  19. showname(){
  20. alert(this.name);
  21. },
  22. showage(){
  23. alert(this.age);
  24. }
  25. }
  26. person.showname();
  27. person.showage();

vue组件

组件(Component)是Vue.js最强大的功能之一。组件可以扩展 HTML 元素,封装可重用的代码。所有的 Vue 组件同时也都是 Vue 的实例,所以可接受相同的选项对象 (除了一些根级特有的选项) 并提供相同的生命周期钩子。

注册及使用组件



   
   
  1. // 注册一个组件:
  2. Vue.component('my-component', {
  3. template: ' <div>A custom component! </div>'
  4. })
  5. //使用组件
  6. <div id="example">
  7. <my-component> </my-component>
  8. </div>
  9. ......
  10. new Vue({
  11. el: '#example'
  12. })

data 必须是函数

组件就是vue的实例,所有vue实例中属性和方法,组件中也可以用,但是data属性必须是一个函数,因为组件会重复使用在多个地方,为了使用在多个地方的组件数据相对独立,data属性需要用一个函数来返回值。



   
   
  1. // 定义组件
  2. Vue.component('simple-counter', {
  3. template: ' <button v-on:click="counter += 1">{{ counter }} </button>',
  4. data: function () {
  5. return {
  6. counter: 0
  7. }
  8. }
  9. })
  10. // 使用组件
  11. <div id="example-2">
  12. <simple-counter> </simple-counter>
  13. <simple-counter> </simple-counter>
  14. <simple-counter> </simple-counter>
  15. </div>
  16. ......
  17. new Vue({
  18. el: '#example-2'
  19. })

props传递数据

如果想给组件中传递参数,组件要显式地用 props 选项声明它预期的数据:



   
   
  1. <!-- 样式 -->
  2. <style>
  3. .breadcrumb{ width: 90%; line-height: 50px;
  4. border-bottom: 1px solid #ddd; margin: 0px auto;}
  5. .breadcrumb .hot{ font-weight:bold; color:red; letter-spacing: 2px;}
  6. </style>
  7. ......
  8. <div id="app">
  9. <bread-crumb pos="首页>图片列表"> </bread-crumb>
  10. </div>
  11. <script>
  12. Vue.component( 'bread-crumb',{
  13. props:[ 'pos'],
  14. template: '<div class="breadcrumb" @click="fnLight">当前位置:<span :class="{hot:isHot}">{{pos}}</span></div>',
  15. data: function(){
  16. return {
  17. isHot: false
  18. }
  19. },
  20. methods:{
  21. fnLight: function(){
  22. this.isHot = ! this.isHot;
  23. }
  24. }
  25. })
  26. let vm = new Vue({
  27. el: '#app'
  28. })
  29. </script>

单文件组件

将一个组件相关的html结构,css样式,以及交互的JavaScript代码从html文件中剥离出来,合成一个文件,这种文件就是单文件组件,相当于一个组件具有了结构、表现和行为的完整功能,方便组件之间随意组合以及组件的重用,这种文件的扩展名为“.vue”,比如:"menu.vue"。

单文件组件代码结构



   
   
  1. // 使用template标签来定义html部分
  2. <template>
  3. <div class="breadcrumb" @click="fnLight">
  4. 当前位置: <span :class="{hot:isHot}">{{pos}} </span>
  5. </div>
  6. </template>
  7. // javascript要写成模块导出的形式:
  8. <script>
  9. export default{
  10. props:[ 'pos'],
  11. name: 'breadcrumb',
  12. data: function(){
  13. return {
  14. isHot: false
  15. }
  16. },
  17. methods:{
  18. fnLight: function(){
  19. this.isHot = ! this.isHot;
  20. }
  21. }
  22. }
  23. </script>
  24. // 样式中如果有scope关键字,表示这些样式是组件局部的,不会影响其他元素
  25. <style scoped>
  26. .breadcrumb{
  27. width: 90%;
  28. line-height: 50px;
  29. border-bottom: 1px solid #ddd;
  30. margin: 0px auto;
  31. }
  32. .breadcrumb .hot{
  33. font-weight:bold;
  34. color:red;
  35. letter-spacing: 2px;
  36. }
  37. </style>

组件嵌套

将单文件组件组合在一起有两种方式,一种是嵌套方式,一种用路由的方式。嵌套的方式代码如下:

下图示中,假设组件A中要嵌入组件B



   
   
  1. <template>
  2. // 在A组件中使用B组件
  3. <B_zujian> </B_zujian>
  4. </template>
  5. <script>
  6. // 先导入B组件,其中'@'表示src目录,组件后的vue扩展名可以省略
  7. import B_zujian from '@/components/B_zjian'
  8. export default{
  9. name: 'A_zujian',
  10. data: function(){
  11. return {
  12. iNum: 0
  13. }
  14. },
  15. // 接着在components属性选项中注册
  16. components:{
  17. B_zujian
  18. }
  19. }
  20. </script>

路由

可以通过路由的方式在一个组件中加载其他组件,要使用路由功能,需要在main.js中先导入路由的包,然后在组件对象中还需要包含它。



   
   
  1. import router from './router'
  2. new Vue({
  3. .....
  4. router
  5. })

组件中通过路由标签来加载其他的路由



   
   
  1. <!-- 路由标签 -->
  2. <router-view> </router-view>
  3. <!-- 简写成下面一个标签的形式: -->
  4. <router-view/>
路由标签里面加载哪个组件呢?在router文件中的index.js文件中设置


   
   
  1. import Vue from 'vue'
  2. import Router from 'vue-router'
  3. // 导入对应组件 '@' 表示src文件夹
  4. import MainList from '@/components/MainList'
  5. import UserList from '@/components/UserList'
  6. import UpDate from '@/components/UpDate'
  7. // 使用路由模块的固定写法
  8. Vue.use(Router)
  9. // path为'/'表示路由默认加载的组件
  10. // 这些路由默认设置的是App.vue中的路由标签加载的组件
  11. export default new Router({
  12. routes: [
  13. {
  14. path: '/',
  15. name: 'MainList',
  16. component: MainList
  17. },
  18. {
  19. path: '/user',
  20. name: 'UserList',
  21. component: UserList
  22. },
  23. {
  24. path: '/update',
  25. name: 'UpDate',
  26. component: UpDate
  27. }
  28. ]
  29. })

通过链接可以切换路由标签里面对应的组件,链接的地址是上面index.js文件中定义的path值,不过链接标签是"router-link",链接地址用'to'来定义:



   
   
  1. <router-link to="/">股票信息 </router-link>
  2. <router-link to="/user">个人中心 </router-link>

链接地址中可以传递参数,格式如下:



   
   
  1. // name对应的是路由中定义的一个path对应的name属性
  2. <router-link :to='{name:"UpDate",params:{code:item.code}}'>

有时候需要在组件的js中跳转页面,也就是改变路由,改变路由有下面这些方式:



   
   
  1. // 当前页面重新加载
  2. this.$router.go('/user');
  3. // 跳转到另外一个路由
  4. this.$router.push({path:'/user'});
  5. // 获取当前的路由地址
  6. var sPath = this.$route.path;

数据请求及跨域

数据请求

数据请求使用的是ajax,在vue中使用的axios.js,这个文件可以在index.html文件中引入,也可以作为模块导入,在main.js中导入这个模块,然后将它绑定在Vue类的原型上。



   
   
  1. import axios from 'axios'
  2. Vue.prototype.axios = axios
在组件的js代码中使用axios:
this.axios({......})

跨域请求

vue的自动化工具提供了开发的服务器,我们在这个服务器环境下开发,改动代码可以马上更新显示,错误了还有代码提示,非常方便,但是,如果我们组件中需要数据,而且数据在另一个服务器环境下运行,我们就需要跨域请求数据,vue工具中可以使用代理来跨域请求,设置的方法是:在项目的config文件夹中,打开index.js,在proxyTable一项中设置:



   
   
  1. // 'http://localhost:7890' 表示的是要跨域请求的地址
  2. // 如果请求的地址是:'http://localhost:7890/index_data'
  3. // 在请求时就可以写成: '/apis/index_data'
  4. '/apis': {
  5. target: 'http://localhost:7890',
  6. changeOrigin: true,
  7. pathRewrite: {
  8. '^/apis': ''
  9. }
  10. }


Vue组件开发自动化工具

Node.js

Node.js是一个新的后端(后台)语言,它的语法和JavaScript类似,所以可以说它是属于前端的后端语言,后端语言和前端语言的区别:

  • 运行环境:后端语言一般运行在服务器端,前端语言运行在客户端的浏览器上
  • 功能:后端语言可以操作文件,可以读写数据库,前端语言不能操作文件,不能读写数据库。

npm

npm是node.js的包管理器,安装了node.js同时会自动安装这个包管理器,可以npm命令来安装node.js的包。这个工具相当于python的pip管理器。

安装vue的自动化工具

vue开发生态区提供了用node.js开发的自动化开发工具包,这个工具包可以帮我们编译单文件组件。



   
   
  1. // 全局安装 vue-cli
  2. npm install --global vue-cli

打包上线

项目开发完成后,需要把请求数据的代理地址改成和提供数据的服务器在同一个域的地址,因为最终会把前端代码放在和数据在同一个域的服务器下面运行。



   
   
  1. // 将下面的请求地址
  2. '/apis/index_data'
  3. // 改成
  4. '/index_data'

改完请求地址后,就可以将代码打包,生成最终可以上线的单文件结构:



   
   
  1. // 打开终端,ctrl+c停掉开发服务器,执行下面的命令
  2. npm run build

自动化程序会将打包的文件自动生成到项目的dist文件夹中。

将这些文件拷贝到提供数据服务的服务器的静态目录文件夹中,完成最终的上线!

本文作者:郭大帅
本文发布时间:2018年06月29日
本文来自云栖社区合作伙伴 CSDN,了解相关信息可以关注csdn.net网站。
目录
相关文章
|
12天前
|
JavaScript 前端开发 程序员
前端原生Js批量修改页面元素属性的2个方法
原生 Js 的 getElementsByClassName 和 querySelectorAll 都能获取批量的页面元素,但是它们之间有些细微的差别,稍不注意,就很容易弄错!
|
13天前
|
JSON 前端开发 JavaScript
聊聊 Go 语言中的 JSON 序列化与 js 前端交互类型失真问题
在Web开发中,后端与前端的数据交换常使用JSON格式,但JavaScript的数字类型仅能安全处理-2^53到2^53间的整数,超出此范围会导致精度丢失。本文通过Go语言的`encoding/json`包,介绍如何通过将大整数以字符串形式序列化和反序列化,有效解决这一问题,确保前后端数据交换的准确性。
29 4
|
23天前
|
机器学习/深度学习 自然语言处理 前端开发
前端神经网络入门:Brain.js - 详细介绍和对比不同的实现 - CNN、RNN、DNN、FFNN -无需准备环境打开浏览器即可测试运行-支持WebGPU加速
本文介绍了如何使用 JavaScript 神经网络库 **Brain.js** 实现不同类型的神经网络,包括前馈神经网络(FFNN)、深度神经网络(DNN)和循环神经网络(RNN)。通过简单的示例和代码,帮助前端开发者快速入门并理解神经网络的基本概念。文章还对比了各类神经网络的特点和适用场景,并简要介绍了卷积神经网络(CNN)的替代方案。
|
23天前
|
移动开发 前端开发 JavaScript
前端实训,刚入门,我用原生技术(H5、C3、JS、JQ)手写【网易游戏】页面特效
于辰在大学期间带领团队参考网易游戏官网的部分游戏页面,开发了一系列前端实训作品。项目包括首页、2021校园招聘页面和明日之后游戏页面,涉及多种特效实现,如动态图片切换和人物聚合效果。作品源码已上传至CSDN,视频效果可在CSDN预览。
29 0
前端实训,刚入门,我用原生技术(H5、C3、JS、JQ)手写【网易游戏】页面特效
|
25天前
|
JavaScript 前端开发 搜索推荐
Moment.js、Day.js、Miment,日期时间库怎么选?
【10月更文挑战第29天】如果你需要一个功能强大、插件丰富的日期时间库,并且对性能要求不是特别苛刻,Moment.js是一个不错的选择;如果你追求极致的轻量级和高性能,那么Day.js可能更适合你;而如果你有一些特定的日期时间处理需求,并且希望在性能和功能之间取得平衡,Miment也是可以考虑的。
|
28天前
|
JavaScript 前端开发 开发者
前端框架对比:Vue.js与Angular的优劣分析与选择建议
【10月更文挑战第27天】在前端开发领域,Vue.js和Angular是两个备受瞩目的框架。本文对比了两者的优劣,Vue.js以轻量级和易上手著称,适合快速开发小型到中型项目;Angular则由Google支持,功能全面,适合大型企业级应用。选择时需考虑项目需求、团队熟悉度和长期维护等因素。
40 1
|
1月前
|
前端开发 JavaScript 开发者
React与Vue:前端框架的巅峰对决与选择策略
【10月更文挑战第23天】React与Vue:前端框架的巅峰对决与选择策略
|
29天前
|
JavaScript 前端开发 API
前端框架对比:Vue.js与Angular的优劣分析与选择建议
【10月更文挑战第26天】前端技术的飞速发展让开发者在构建用户界面时有了更多选择。本文对比了Vue.js和Angular两大框架,介绍了它们的特点和优劣,并给出了在实际项目中如何选择的建议。Vue.js轻量级、易上手,适合小型项目;Angular结构化、功能强大,适合大型项目。
25 1
|
1月前
|
前端开发 JavaScript 数据管理
React与Vue:两大前端框架的较量与选择策略
【10月更文挑战第23天】React与Vue:两大前端框架的较量与选择策略
|
1月前
|
存储 JavaScript 前端开发
decimal.js库的安装和使用方法
【10月更文挑战第24天】decimal.js 是一个非常实用的高精度计算库,通过合理的安装和使用,可以在 JavaScript 中实现精确的数值计算和处理。你可以根据具体的需求和项目情况,灵活运用该库来解决数字精度丢失的问题。