vue遇到的一些问题

vue的使用涉及的一些技术栈

CLI:Vue-CLI

UI:Element

HTML:Pug(Jade)

CSS:Less

JavaScript:ES6

ES6 import引用问题

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

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

鉴于这个原因,进行复杂数据类型的导出时,需要注意多个组件导入同一数据对象时修改数据后可能产生的问题

此外,模块定义变量或函数时即使使用let 而不是const,再导入使用时都会变成只读,不能重复 赋值,效果等同于const声明

在vue中使用pug与less

安装依赖

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

npm:pug -D

npm:less-loader - D

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

定义全局函数或者变量

在vue中,每一个单文件组件都有一个独立的上下文(this)。通常在异常处理中,需要在视图上有所体现,这个时候我们就需要访问this对象,但是全局函数的上下文通常是window,这时候需要一些特殊的处理了

简单粗暴型

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

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

errHandler.js

window.errHandler = function(){

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

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

}esle{

//.....

}

}

在入口文件中导入

//src/main.js

import‘errHandler.js

在组件中只用

// xxx.vue
export defalut{
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 form ‘@/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‘

解决路径过长的麻烦

CSS作用域与模块

组件内样式

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

<style lang="less" scoped>
@import ‘other.less‘;
.title{
font-size: 1.2rem;
}
</style>

在有scoped属性的style标签内导入其他样式,同样会受限与作用域,变为组件内样式。

在组件样式中应避免使用元素选择器,原因在于元素选择器与属性选择器时,性能会大大降低

两种组合选择器的测试  classes selector,    elements  selector

时间: 2024-12-26 08:36:52

vue遇到的一些问题的相关文章

Vue.js学习笔记:属性绑定 v-bind

v-bind  主要用于属性绑定,Vue官方提供了一个简写方式 :bind,例如: <!-- 完整语法 --> <a v-bind:href="url"></a> <!-- 缩写 --> <a :href="url"></a> 绑定HTML Class 一.对象语法: 我们可以给v-bind:class 一个对象,以动态地切换class.注意:v-bind:class指令可以与普通的class特

在浏览器上安装 Vue Devtools工具

Vue.js devtools是基于google chrome浏览器的一款调试vue.js应用的开发者浏览器扩展,可以在浏览器开发者工具下调试代码. 1)首先在github下载devtools源码,地址:https://github.com/vuejs/vue-devtools. 2)下载好后进入vue-devtools-master工程 执行cnpm install, 下载依赖,然后执行npm run build,编译源程序. 3)编译完成后,目录结构如下: 修改shells.chrome目录

vue.js 入门

简单一句话来描述:vue.js是一个前端框架. 官方文档:https://cn.vuejs.org/v2/guide/index.html 虽然,我以前也会改一些前端样式,但主要是基于HTML和CSS,HTML主要控制页面的结构,CSS主要来控制样式.涉及到JavaScript就比较小白了. 我花了一个下午照着官方文档做练习,当然是只创建一个xxx_demo.html文件,在<script></script> 标签对之间写 Vue.js语法.这不算错,但在工程化的今天,这么学得猴年

Vue.js系列之项目搭建(vue2.0 + vue-cli + webpack )

1.安装node node.js环境(npm包管理器) cnpm npm的淘宝镜像 从node.js官网下载并安装node,安装过程很简单,一路"下一步"就可以了(傻瓜式安装).安装完成之后,打开命令行工具,输入 node -v,如果出现相应的版本号,则说明安装成功. npm包管理器,是集成在node中的,所以,直接输入 npm -v就会显示出npm的版本信息. 2.安装cnpm 在命令行中输入 npm install -g cnpm --registry=http://registr

Vue.js项目模板搭建

前言 从今年(2017年)年初起,我们团队开始引入「Vue.js」开发移动端的产品.作为团队的领头人,我的首要任务就是设计 整体的架构 .一个良好的架构必定是具备丰富的开发经验后才能搭建出来的.虽然我有多年的前端开发经验,但就「Vue.js」来说,仍然是个新手.所幸「Vue.js」有一个配套工具「Vue-CLI」,它提供了一些比较成熟的项目模板,很大程度上降低了上手的难度.然而,很多具体的问题还是要自己思考和解决的. 项目划分 我们公司的H5产品大部分是嵌套在手机客户端里面的页面.每个项目的功能

vue项目搭建

VUE项目搭建 # 全局安装 vue-cli $ npm install --global vue-cli # 创建一个基于 webpack 模板的新项目 $ vue init webpack my-project # 安装依赖,走你 $ cd my-project $ npm install $ npm run dev

Vue内容分发slot

前面的话 为了让组件可以组合,需要一种方式来混合父组件的内容与子组件自己的模板.这个过程被称为 内容分发 (或 “transclusion” ).Vue实现了一个内容分发 API,参照了当前 Web 组件规范草案,使用特殊的 <slot> 元素作为原始内容的插槽.本文将详细介绍Vue内容分发slot 编译作用域 在深入内容分发 API 之前,先明确内容在哪个作用域里编译.假定模板为 <child-component> {{ message }} </child-compone

一步一步学习Vue(十一)

本篇继续学习vuex,还是以实例为主:我们以一步一步学Vue(四)中讲述的例子为基础,对其改造,基于vuex重构一遍,这是原始的代码: todolist.js ; (function () { var list = []; var Todo = (function () { var id = 1; return function (title, desc) { this.title = title; this.desc = desc; this.id = id++; } })(); /** *

vue.js路由

Vue.js 路由 Vue.js 路由允许我们通过不同的 URL 访问不同的内容. 通过 Vue.js 可以实现多视图的单页Web应用(single page web application,SPA). Vue.js 路由需要载入 vue-router 库 中文文档地址:vue-router文档. 安装 1.直接下载 / CDN https://unpkg.com/vue-router/dist/vue-router.js NPM 推荐使用淘宝镜像: cnpm install vue-route

【Vue】详解Vue生命周期

Vue实例的生命周期全过程(图) (这里的红边圆角矩形内的都是对应的Vue实例的钩子函数) 在beforeCreate和created钩子函数间的生命周期 在beforeCreate和created之间,进行数据观测(data observer) ,也就是在这个时候开始监控data中的数据变化了,同时初始化事件 created钩子函数和beforeMount间的生命周期 对于created钩子函数和beforeMount间可能会让人感到有些迷惑,下面我就来解释一下: el选项的有无对生命周期过程