本站业务范围:1、PC端软件开发、网站开发 2、移动端APP、网站、微信接口、微商城开发 3、视频教程、课程设计和辅导 4、单片机开发 5、串口通讯调试
 当前位置:文章中心 >> Jquery_Ajax_Javascript
立即购买视频教程 vuejs学习问题汇总
夜鹰教程网 来源:www.yyjcw.com 日期:2019-1-2 9:03:32
vuejs学习问题汇总

这篇文章不能解决你的问题?我们还有相关视频教程云课堂 全套前端开发工程师培训课程

微信号:yyjcw10000 QQ:1416759661  远程协助需要加QQ!

业务范围:视频教程|程序开发|在线解答|Demo制作|远程调试| 点击查看相关的视频教程

技术范围:全端开发/前端开发/webapp/web服务/接口开发/单片机/C#/java/node/sql server/mysql/mongodb/android/。 



由于公司的前端开始转向 VueJS,最近开始使用这个框架进行开发,遇到一些问题记录下来,以备后用。

主要写一些 官方手册 上没有写,但是实际开发中会遇到的问题,需要一定知识基础。


涉及技术栈

CLI: Vue-CLI

UI: Element

HTML: Pug(Jade)

CSS: Less

JavaScript: ES6

polyfill 与 transform-runtime

首先,vue-cli 为我们自动添加了 babel-plugin-transform-runtime 这个插件,该插件多数情况下都运作正常,可以转换大部分 ES6 语法。

但是,存在如下两个问题:


1、异步加载组件时,会产生 polyfill 代码冗余

2、不支持对全局函数与实例方法的 polyfill

两个问题的原因均归因于 babel-plugin-transform-runtime 采用了沙箱机制来编译我们的代码(即:不修改宿主环境的内置对象)。


  由于异步组件最终会被编译为一个单独的文件,所以即使多个组件中使用了同一个新特性(例如:Object.keys()),那么在每个编译后的文件中都会有一份该新特性的 polyfill 拷贝。如果项目较小可以考虑不使用异步加载,但是首屏的压力会比较大。

  不支持全局函数(如:Promise、Set、Map),Set 跟 Map 这两种数据结构应该大家用的也不多,影响较小。但是 Promise 影响可能就比较大了。

  不支持实例方法(如:'abc'.include('b')、['1', '2', '3'].find((n) => n < 2) 等等),这个限制几乎废掉了大部分字符串和一半左右数组的新特性。


一般情况下 babel-plugin-transform-runtime 能满足大部分的需求,当不满足需求时,推荐使用完整的 babel-polyfill。

替换 babel-polyfill

首先,从项目中移除 babel-plugin-transform-runtime

  卸载该依赖:


npm un babel-plugin-transform-runtime -D

  修改 babel 配置文件


// .babelrc

{

  //...

  "plugins": [

    // - "transform-runtime"

  ]

  //...

}

  然后,安装 babel-polyfill 依赖:


npm i babel-polyfill -D

  最后,在入口文件中导入


// src/main.js

import 'babel-polyfill'

ES6 import 引用问题

  在 ES6 中,模块系统的导入与导出采用的是引用导出与导入(非简单数据类型),也就是说,如果在一个模块中定义了一个对象并导出,在其他模块中导入使用时,导入的其实是一个变量引用(指针),如果修改了对象中的属性,会影响到其他模块的使用。

  通常情况下,系统体量不大时,我们可以使用 JSON.parse(JSON.stringify(str)) 简单粗暴地来生成一个全新的深度拷贝的 数据对象。不过当组件较多、数据对象复用程度较高时,很明显会产生性能问题,这时我们可以考虑使用 Immutable.js。


鉴于这个原因,进行复杂数据类型的导出时,需要注意多个组件导入同一个数据对象时修改数据后可能产生的问题。此外,模块定义变量或函数时即便使用 let 而不是 const,在导入使用时都会变成只读,不能重新赋值,效果等同于用 const 声明。

在 Vue 中使用 Pug 与 Less

安装依赖


  Vue 中使用 vue-loader 根据 lang 属性自动判断所需要的 loader,所以不用额外配置 Loader,但是需要手动安装相关依赖:


npm i pug -D

npm i less-loader -D

还是相当方便的,不用手动修改 webpack 的配置文件添加 loader 就可以使用了


使用 pug 还是 pug-loader?sass 两种语法的 loader 如何设置?--- 请参考 预处理器 · vue-loader

使用


<!-- xxx.vue -->

<style>

  .action {

    color: #ddd;

      ul {

        overflow: hidden;

        li {

          float: left;

        }

      }

  }

</style>

<template>

  .action(v-if='hasRight')

    ul

      li 编辑

      li 删除

</template>

<script>

  export default {

    data () {

      return {

        hasRight: true

      }

    }

  }

</script>

定义全局函数或变量

  许多时候我们需要定义一些全局函数或变量,来处理一些频繁的操作(这里拿 AJAX 的异常处理举例说明)。但是在 Vue 中,每一个单文件组件都有一个独立的上下文(this)。通常在异常处理中,需要在视图上有所体现,这个时候我们就需要访问 this 对象,但是全局函数的上下文通常是 window,这时候就需要一些特殊处理了。


简单粗暴型


  最简单的方法就是直接在 window 对象上定义一个全局方法,在组件内使用的时候用 bind、call 或 apply 来改变上下文。

  定义一个全局异常处理方法:


// errHandler.js

window.errHandler = function () { // 不能使用箭头函数

  if (err.code && err.code !== 200) {

    this.$store.commit('err', true)

  } else {

    // ...

  }

}

  在入口文件中导入:


// src/main.js

import 'errHandler.js'

  在组件中使用:


// xxx.vue

export default {

  created () {

    this.errHandler = window.errHandler.bind(this)

  },

  method: {

    getXXX () {

      this.$http.get('xxx/xx').then(({ body: result }) => {

        if (result.code === 200) {

          // ...

        } else {

          this.errHandler(result)

        }

      }).catch(this.errHandler)

    }

  }

}

优雅安全型


  在大型多人协作的项目中,污染 window 对象还是不太妥当的。特别是一些比较有个人特色的全局方法(可能在你写的组件中几乎处处用到,但是对于其他人来说可能并不需要)。这时候推荐写一个模块,更优雅安全,也比较自然,唯一不足之处就是每个需要使用该函数或方法的组件都需要进行导入。

  使用方法与前一种大同小异,就不多作介绍了。 ̄


自定义路径别名

  可能有些人注意到了,在 vue-cli 生成的模板中在导入组件时使用了这样的语法:


import Index from '@/components/Index'

  这个 @ 是什么东西?后来改配置文件的时候发现这个是 webpack 的配置选项之一:路径别名。

  我们也可以在基础配置文件中添加自己的路径别名,比如下面这个就把 ~ 设置为路径 src/components 的别名:


// build/webpack.base.js

{

  resolve: {

    extensions: ['.js', '.vue', '.json'],

    alias: {

      'vue$': 'vue/dist/vue.esm.js',

      '@': resolve('src'),

      '~': resolve('src/components')

    }

  }

}

  然后我们导入组件的时候就可以这样写:


// import YourComponent from 'YourComponent'

// import YourComponent from './YourComponent'

// import YourComponent from '../YourComponent'

// import YourComponent from '/src/components/YourComponent'

import YourComponent from '~/YourComponent'

  既解决了路径过长的麻烦,又解决了相对路径的烦恼,方便很多吧!


CSS 作用域与模块

组件内样式


  通常,组件中 标签里的样式是全局的,在使用第三方 UI 库(如:Element)时,全局样式很可能影响 UI 库的样式。我们可以通过添加 scoped 属性来使 style 中的样式只作用于当前组件:


<style scoped>

  @import 'other.less';

  .title {

    font-size: 1.2rem;

  }

</style>

在有 scoped 属性的 style 标签内导入其他样式,同样会受限于作用域,变为组件内样式。复用程度较高的样式不建议这样使用。另,在组件内样式中应避免使用元素选择器,原因在于元素选择器与属性选择器组合时,性能会大大降低。--- 两种组合选择器的测试:classes selector,elements selector

导入样式


相对于 style 使用 scoped 属性时的组件内样式,有时候我们也需要添加一些全局样式。当然我们可以用没有 scoped 属性的 style 来写全局样式。但是相比较,更推荐下面这种写法:


/* 单独的全局样式文件 */

/* style-global.less */

body {

  font-size: 10px;

}

.title {

  font-size: 1.4rem;

  font-weight: bolder;

}

  然后在入口文件中导入全局样式:


// src/main.js

import 'style-global.less'

获取表单控件值

  通常我们可以直接使用 v-model 将表单控件与数据进行绑定,但是有时候我们也会需要在用户输入的时候获取当前值(比如:实时验证当前输入控件内容的有效性)。


  这时我们可以使用 @input 或 @change 事件绑定我们自己的处理函数,并传入 $event 对象以获取当前控件的输入值:


<input type='text' @change='change($event)'>

change (e) {

  let curVal = e.target.value

  if (/^\d+$/.test(curVal)) {

    this.num = +curVal

  } else {

    console.error('%s is not a number!', curVal)

  }

}

当然,如果 UI 框架采用 Element 会更简单,它的事件回调会直接传入当前值。


v-for 的使用 tips

  v-for 指令很强大,它不仅可以用来遍历数组、对象,甚至可以遍历一个数字或字符串。


  基本语法就不讲了,这里讲个小 tips:


索引值


  在使用 v-for 根据对象或数组生成 DOM 时,有时候需要知道当前的索引。我们可以这样:


<ul>

  <li v-for='(item, key) in items' :key='key'> {{ key }} - {{ item }}

</ul>

  但是,在遍历数字的时候需要注意,数字的 value 是从 1 开始,而 key 是从 0 开始:


<ul>

  <li v-for='(v, k) in 3' :key='k'> {{ k }}-{{ v }} 

  <!-- output to be 0-1, 1-2, 2-3 -->

</ul>

2.2.0+ 的版本里,当在组件中使用 v-for 时,key 现在是必须的。

模板的唯一根节点

  与 JSX 相同,组件中的模板只能有一个根节点,即下面这种写法是 错误 的:


<template>

  <h1>Title</h1>

  <article>Balabala...</article>

</template>

  我们需要用一个块级元素把他包裹起来:


<template>

  <div>

    <h1>Title</h1>

    <article>Balabala...</article>

  </div>

</template>

原因参考:React-小记:组件开发注意事项#唯一根节点

项目路径配置

  由于 vue-cli 配置的项目提供了一个内置的静态服务器,在开发阶段基本不会有什么问题。但是,当我们把代码放到服务器上时,经常会遇到静态资源引用错误,导致界面一片空白的问题。


  这是由于 vue-cli 默认配置的 webpack 是以站点根目录引用的文件,然而有时候我们可能需要把项目部署到子目录中。


  我们可以通过 config/index.js 来修改文件引用的相对路径:


  build.assetsSubDirectory: 'static'

  build.assetsPublicPath: '/'


  dev.assetsSubDirectory: 'static'

  dev.assetsPublicPath: '/'

  我们可以看到导出对象中 build 与 dev 均有 assetsSubDirectory、assetsPublicPath 这两个属性。


  其中 assetsSubDirectory 指静态资源文件夹,也就是打包后的 js、css、图片等文件所放置的文件夹,这个默认一般不会有问题。


  assetsPublicPath 指静态资源的引用路径,默认配置为 /,即网站根目录,与 assetsSubDirectory 组合起来就是完整的静态资源引用路径 /static。


  写到这里解决方法已经很明显了,只要把根目录改为相对目录就好了:


  build.assetsSubDirectory: 'static'

  build.assetsPublicPath: './'

  没错!就是一个 . 的问题。

文章还在完善中,欢迎大家一起讨论 Vue.JS 开发中遇到的一些问题哈 /


复制链接 网友评论 收藏本文 关闭此页
上一条: 原生js添加和删除元素属性  下一条: 具有iterable类型的集合可以通过新的fo…
夜鹰教程网成立于2008年,目前已经运营了将近 13 年,发布了大量关于 html5/css3/C#/asp.net/java/python/nodejs/mongodb/sql server/android/javascript/mysql/mvc/easyui/vue/echarts原创教程。 我们一直都在坚持的是:认证负责、一丝不苟、以工匠的精神来打磨每一套教程,让读者感受到作者的用心。我们默默投入的时间,确保每一套教程都是一件作品,而不是呆板的文字和视频! 目前我们推出在线辅导班试运营,模式为一对一辅导,教学工具为QQ。我们的辅导学科包括 java 、android原生开发、webapp开发、商城开发、C#和asp.net开发,winform和物联网开发、web前端开发,但不仅限于此。 普通班针对的是国内学员,例如想打好基础的大学生、想转行的有志青年、想深入学习的程序员、想开发软件的初学者或者业余爱好者等。 就业办针对即将毕业上岗的大四学生,或者打算转行的初级开发工程师。 留学生班针对的是在欧美、加拿大、澳洲、日本、韩国、新加坡等地留学的中国学子,目的是让大家熟练地掌握编程技能,按时完成老师布置的作业,并能顺利地通过考试。 详细咨询QQ:1416759661   夜鹰教程网  基于角色的权限管理系统(c-s/b-s)。
  夜鹰教程网  基于nodejs的聊天室开发视频教程
  夜鹰教程网  Git分布式版本管理视频教程
  夜鹰教程网  MVC+EasyUI视频教程
  夜鹰教程网  在线考试系统视频教程
  夜鹰教程网  MongoDB视频教程。
  夜鹰教程网 Canvas视频教程
  夜鹰教程网 报表开发视频教程
  推荐教程/优惠活动

  热门服务/教程目录

  夜鹰教程网  新手必看,详细又全面。
  夜鹰教程网  购买教程  夜鹰教程网  在线支付-方便
  夜鹰教程网  担保交易-快捷安全   夜鹰教程网  闪电发货
  夜鹰教程网  电话和QQ随时可以联系我们。
  夜鹰教程网 不会的功能都可以找我们,按工作量收费。

客服电话:153 9760 0032

购买教程QQ:1416759661  
  热点推荐
ajax 清除缓存的两种方法
js日历控件点击日期显示在文本框中…
HTML、JS与FLASH 之间的静态传值方…
主题:ajax请求JSP,为什么GET就是…
javascript 改变iframe(框架)的方…
javascript取鼠标当前坐标
推荐一款网页软键盘 很漂亮的哦
ajax session过期问题的几个解决方…
js文字间隔停顿向上滚动效果
ajax 服务器文本框自动填值
js技术技巧收藏(200例)---1
ajax 数据库中随机读取5条数据动态…
主题:这是否是个捷径?Ajax利用S…
揭开AJAX神秘的面纱(AJAX个人学习…
常用的JS后台导航菜单
  尊贵服务
夜鹰教程网 承接业务:软件开发 网站开发 网页设计 .Net+C#+VS2008+MSsql+Jquery+ExtJs全套高清完整版视频教程
  最近更新
js处理键盘事件(keydown event)…
Web前端技术疑点难点汇总
Asp.Net Core2.0允许跨域请求设置…
XMLHttpRequest请求中的跨域问题
原生js节点的操作 创建、添加、移…
VUE2.0组件:父组件子组件之间值的…
JavaScript是世界上最流行的脚本语…
js正则表达式表单验证详解
js正则表达式大全
详细且实用的JS正则表达式大全
EcmaScript5中扩展了叫bind的方法…
attachEvent和addEventListener的…
addEventListener的使用方式
通过构造器的方式来创建函数
为什么需要addEventListener
  工具下载  需要远程协助? 

sql2008视频教程 c#视频教程

VIP服务:如果您的某个功能不会做,可以加我们QQ,给你做DEMO!

JQUERY  Asp.net教程

MVC视频教程  vs2012
.NET+sql开发
手机:15397600032 C#视频教程下载
微信小程序 vue.js高级实例视频教程

教程咨询QQ:1416759661


这篇文章不能解决你的问题?我们还有相关视频教程云课堂 全套前端开发工程师培训课程

微信号:yyjcw10000 QQ:1416759661  远程协助需要加QQ!

业务范围:视频教程|程序开发|在线解答|Demo制作|远程调试| 点击查看相关的视频教程

技术范围:全端开发/前端开发/webapp/web服务/接口开发/单片机/C#/java/node/sql server/mysql/mongodb/android/。 



关于我们 | 购买教程 | 网站建设 | 技术辅导 | 常见问题 | 联系我们 | 友情链接

夜鹰教程网 版权所有 www.yyjcw.com All rights reserved 备案号:蜀ICP备08011740号3