浅谈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 相关文章推荐
让jQuery Mobile不显示讨厌loading界面的方法
Feb 19 Javascript
jquery跨域请求示例分享(jquery发送ajax请求)
Mar 25 Javascript
AngularJS实现表单验证
Jan 28 Javascript
使用jquery实现鼠标滑过弹出更多相关信息层附源码下载
Nov 23 Javascript
js判断价格,必须为数字且不能为负数的实现方法
Oct 07 Javascript
Javascript之深入浅出prototype
Feb 06 Javascript
JavaScript之实现一个简单的Vue示例
Jan 17 Javascript
JS使用cookie保存用户登录信息操作示例
May 30 Javascript
解决IOS端微信H5页面软键盘弹起后页面下方留白的问题
Jun 05 Javascript
vue3.0中使用postcss-pxtorem的具体方法
Nov 20 Javascript
微信小程序实现同时上传多张图片
Feb 03 Javascript
Vue中使用wangeditor富文本编辑的问题
Feb 07 Vue.js
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的ob_start() 控制您的浏览器cache
2009/08/03 PHP
thinkPHP框架实现多表查询的方法
2018/06/14 PHP
PHP count()函数讲解
2019/02/03 PHP
PHP实现二维数组按照指定的字段进行排序算法示例
2019/04/23 PHP
laravel 时间格式转时间戳的例子
2019/10/11 PHP
JavaScript Event学习第八章 事件的顺序
2010/02/07 Javascript
分享一个自定义的console类 让你不再纠结JS中的调试代码的兼容
2012/04/20 Javascript
JQuery插件Style定制化方法的分析与比较
2012/05/03 Javascript
体验js中splice()的强大(插入、删除或替换数组的元素)
2013/01/16 Javascript
点击弹出层效果&amp;弹出窗口后网页背景变暗效果的实现代码
2014/02/10 Javascript
JavaScript的各种常见函数定义方法
2014/09/16 Javascript
Jquery实现由下向上展开效果的例子
2014/12/08 Javascript
node.js中的require使用详解
2014/12/15 Javascript
nodejs实现遍历文件夹并统计文件大小
2015/05/28 NodeJs
使用 JavaScript 进行函数式编程 (一) 翻译
2015/10/02 Javascript
jQuery实现瀑布流布局详解(PC和移动端)
2020/09/01 Javascript
浅析Bootstrap表格的使用
2016/06/23 Javascript
jQuery Ajax向服务端传递数组参数值的实例代码
2017/09/03 jQuery
[01:31]DOTA2上海特级锦标赛 SECRET战队完整宣传片
2016/03/16 DOTA
Python中函数及默认参数的定义与调用操作实例分析
2017/07/25 Python
对python中raw_input()和input()的用法详解
2018/04/22 Python
Python基于jieba库进行简单分词及词云功能实现方法
2018/06/16 Python
IntelliJ IDEA安装运行python插件方法
2018/12/10 Python
对python中数据集划分函数StratifiedShuffleSplit的使用详解
2018/12/11 Python
Django csrf 两种方法设置form的实例
2019/02/03 Python
numpy实现神经网络反向传播算法的步骤
2019/12/24 Python
django 实现手动存储文件到model的FileField
2020/03/30 Python
Python实现手绘图效果实例分享
2020/07/22 Python
中学实习教师自我鉴定
2013/12/12 职场文书
打架检讨书100字
2014/01/19 职场文书
汉语言文学专业自荐信
2014/06/11 职场文书
鼓舞士气的口号
2014/06/16 职场文书
秋季运动会广播稿(30篇)
2014/09/13 职场文书
社区党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
教师批评与自我批评总结
2014/10/16 职场文书
北京爱情故事观后感
2015/06/12 职场文书