浅谈vue项目重构技术要点和总结


Posted in Javascript onJanuary 23, 2018

前言

最近太忙了,博客好久没有更新了。今天忙里偷闲,简单总结一下最近vue项目重构的一些技术要点。

vue数据更新, 视图未更新

这个问题我们经常会遇到,一般是vue数据赋值的时候,vue数据变化了,但是视图没有更新。这个不算是项目重构的技术要点,也和大家分享一下vue2.0通常的解决方案吧!

解决方案如下:

1、通过vue.set方式赋值

Vue.set(数据源, key, newValue)

2、 通过Array.prototype.splice方法

数据源.splice(indexOfItem, 1, newValue)

3、修改数据的长度

数据源.splice(newLength)

4、变异方法

Vue.js 包装了被观察数组的变异方法,故它们能触发视图更新。被包装的方法有:

push()
pop()
shift()
unshift()
splice()
sort()
reverse()

prop 对象数组应用

在 JavaScript 中对象和数组是引用类型,指向同一个内存空间,如果 prop 是一个对象或数组, 在子组件内部改变它会影响父组件的状态 。利用这一点,我们在子组件中改变prop数组或者对象,父组件以及所有应用到prop中数据的地方都会变化。我之前写过一篇js深拷贝和浅拷贝的文章,感兴趣的去看下,其实,原理是一致的。

案例如下:

<input class="pinput max" type="text" v-model="itemData.data.did">

<script>
export default {
 components: {
 },
 data() {
 },
 props: {
 itemData: Object
 },
 methods: {
 }
};
</script>

所有应用到itemData的地方都会变化!

上面这种改变prop,Vue 不会在控制台给出警告,假如我们完全改变或者赋值prop,控制台会发出警告!引用官方给出的解决方案如下:

1、定义一个局部变量,并用 prop 的值初始化它:

props: ['initialCounter'],
data: function () {
 return { counter: this.initialCounter }
}

2、定义一个计算属性,处理 prop 的值并返回:

props: ['size'],
computed: {
 normalizedSize: function () {
 return this.size.trim().toLowerCase()
 }
}

v-model 的一些坑

其实v-model和sync都是一些语法糖,我之前有文章介绍过,官网也能找到类似的案例!

v-model 数据有时候是undefined的时候,不会报错,所以,一定要注意,v-model不能是undefined,否则有些莫名的问题!

重构-动态组件的创建

有时候我们有很多类似的组件,只有一点点地方不一样,我们可以把这样的类似组件写到配置文件中,动态创建和引用组件

方法一:component 和is配合使用

通过使用保留的 元素,并对其 is 特性进行动态绑定,你可以在同一个挂载点动态切换多个组件:

var vm = new Vue({
 el: '#example',
 data: {
 currentView: 'home'
 },
 components: {
 home: { /* ... */ },
 posts: { /* ... */ },
 archive: { /* ... */ }
 }
})
<component v-bind:is="currentView">
 <!-- 组件在 vm.currentview 变化时改变! -->
</component>

方法二:通过render方法创建

<script>
export default {
 data() {
 return {
 };
 },
 render: function(createElement) {
 let _type = bi.chart.data.type;
 let _attr = bi.chart.components[_type]["attr"];
 return createElement(_attr, {
  props: {
  }
 });
 }
};
</script>

bi.chart.components[_type]["attr"]这个是在配置文件中动态配置的,type点击的时候会改变,会取不同type下面的attr属性!

公共属性抽离

我们在项目中,经常会用很多状态或者数据,我们可以把很多公共数据抽离出来,放到一个对象中,后面我们可以监听这个数据对象变化。进行数据保存或者获取。

c: {
 handler: function (val, oldVal) { /* ... */ },
 deep: true
},
// 该回调将会在侦听开始之后被立即调用
d: {
 handler: function (val, oldVal) { /* ... */ },
 immediate: true
},

可以利用上面深度监听。假如初始化的时候要立即执行,我们可以用立即执行监听!

require动态加载依赖

我们可以利用require同步特性,在代码中动态加载依赖,例如下面echart主题,我们可以点击切换的时候,动态加载!

require("echarts/theme/"+ data.theme);

import加载要放到头部,初始化的时候,可以把默认主题用import加载进来!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
一个JS的日期格式化算法示例
Jul 31 Javascript
JavaScript中的公有、私有、特权和静态成员用法分析
Nov 20 Javascript
node.js使用npm 安装插件时提示install Error: ENOENT报错的解决方法
Nov 20 Javascript
js+jquery常用知识点汇总
Mar 03 Javascript
jQuery+jRange实现滑动选取数值范围特效
Mar 14 Javascript
javascript属性访问表达式用法分析
Apr 25 Javascript
PHP+jQuery实现随意拖动层并即时保存拖动位置
Apr 30 Javascript
js时钟翻牌效果实现代码分享
Jul 31 Javascript
js 将input框中的输入自动转化成半角大写(税号输入框)
Feb 16 Javascript
AngularJS实现动态添加Option的方法
May 17 Javascript
JS获取月的第几周和年的第几周实例代码
Dec 05 Javascript
详解如何用webpack4从零开始构建react开发环境
Jan 27 Javascript
bootstrap fileinput插件实现预览上传照片功能
Jan 23 #Javascript
php 解压zip压缩包内容到指定目录的实例
Jan 23 #Javascript
three.js 入门案例详解
Jan 23 #Javascript
BootStrap自定义popover,点击区域隐藏功能的实现
Jan 23 #Javascript
vuex的使用及持久化state的方式详解
Jan 23 #Javascript
jquery 输入框查找关键字并提亮颜色的实例代码
Jan 23 #jQuery
js 实现复选框只能选择一项的示例代码
Jan 23 #Javascript
You might like
php生成图形验证码几种方法小结
2013/08/15 PHP
Linux安装配置php环境的方法
2016/01/14 PHP
Prototype 工具函数 学习
2009/07/23 Javascript
Dom 结点创建 基础知识
2011/10/01 Javascript
仿中关村在线首页弹出式广告插件(jQuery版)
2012/05/03 Javascript
JavaScript实现拼音排序的方法
2012/11/20 Javascript
js脚本实现数据去重
2014/11/27 Javascript
60个很实用的jQuery代码开发技巧收集
2014/12/15 Javascript
究竟什么是Node.js?Node.js有什么好处?
2015/05/29 Javascript
KnockoutJS 3.X API 第四章之事件event绑定
2016/10/10 Javascript
jquery的父、子、兄弟节点查找,节点的子节点循环方法
2016/12/07 Javascript
原生Javascript插件开发实践
2017/01/09 Javascript
详解Vue.js组件可复用性的混合(mixin)方式和自定义指令
2017/09/06 Javascript
nodejs异步编程基础之回调函数用法分析
2018/12/26 NodeJs
[54:08]LGD女子刀塔学院 DOTA2炼金术士教学
2014/01/09 DOTA
一些常用的Python爬虫技巧汇总
2016/09/28 Python
python机器学习之神经网络(三)
2017/12/20 Python
python微信公众号之关键词自动回复
2018/06/15 Python
Python中字符串与编码示例代码
2019/05/20 Python
python实现植物大战僵尸游戏实例代码
2019/06/10 Python
Django后台admin的使用详解
2019/07/08 Python
Python math库 ln(x)运算的实现及原理
2019/07/17 Python
Python 字符串类型列表转换成真正列表类型过程解析
2019/08/26 Python
python3中rank函数的用法
2019/11/27 Python
在Python中实现函数重载的示例代码
2019/12/12 Python
Python使用sys.exc_info()方法获取异常信息
2020/07/23 Python
Python 里最强的地图绘制神器
2021/03/01 Python
HTML5 虚拟键盘出现挡住输入框的解决办法
2017/02/14 HTML / CSS
JD Sports意大利:英国篮球和运动时尚的领导者
2017/10/29 全球购物
Nordgreen台湾官网:极简北欧设计手表
2019/08/21 全球购物
如何手工释放资源
2013/12/15 面试题
办公室文秘自我评价
2013/09/21 职场文书
新闻专业推荐信范文
2013/11/20 职场文书
2015年小学语文教学工作总结
2015/05/25 职场文书
实习单位鉴定意见
2015/06/04 职场文书
用python开发一款操作MySQL的小工具
2021/05/12 Python