关于vue的一些实践

参考文章:vue中需要注意的问题总结(上)

1.对于sync的使用

参考vue的修饰符sync

在有些情况下,我们可能需要对一个 prop 进行“双向绑定”。不幸的是,真正的双向绑定会带来维护上的问题,因为子组件可以修改父组件,且在父组件和子组件都没有明显的改动来源。
这个sync可以在你不得不在子组件改变父组件的传值 后,反馈给父组件时使用.
在父组件中使用

<text-document v-bind:title.sync="doc.title"></text-document>

在子组件<text-document>中,如果需要改变title的值,则需要使用this.emit('update:propName',newValue);用法和this.set(被更新的)

this.$emit('update:title', newTitle)

2.对于父组件传过来的值需要立即调用

问题:开发的业务组件,父组件使用子组件时,给子组件传递一个prop为name的属性,子组件在创建时,根据这个prop值去做一些异步操作,包含请求后端数据等(本人觉得组件开发冗余业务操作有些怪怪的,但是没有更好的选择).实际上在created()钩子函数调用,获取到的name有时候是undefined.

  1. 有时获取到的值是undefined的原因是html标签不区分大小写,传值失败.
    这时建议传值的话使用<my-a :my-attr='myAttr'></my-a>这种形式传值.而组件实际定义的prop:['myAttr'],参考文章vue的prop传值失败问题
  2. 父组件数据还未获取时就向子组件传props,导致子组件不到数据而报错。
    这个的话,使用比较迂回的做法,等到父组件传递某个数据的时候,才去渲染dom.
    mpvue父子组件props传参失败的解决方案
    这篇文章分析的比较全面:
    详解vue2父组件传递props异步数据到子组件的问题
    比较完美的做法,结合watch来监听prop的变化,收到父组件给到的符合预期的值,再去做其他操作:
 props: {
    parent: {
      type: Object,
      required: true,
      default: () => {
        sons: [];
      }
   },
 watch: {
//,而immediate:true代表如果在 wacth 里声明了 parent之后,就会立即先去执行里面的handler方法,如果为 false就跟我们以前的效果一样,不会在绑定的时候就执行。
    parent: {
      immediate: true,
      handler: async function(newer) {
        //异步加载后代函数
        this.sons = await this.loadSons(newer);
//这里通过sync来同步更新parent的值
        //const { parent } = this;
     //   parent.sons = this.sons;
        //this.$emit("update:parent", parent);
        console.log(this.sons);
        console.log(parent, "parent");
      }
    }
  }

3.新增加对象属性页面不更新

参考文章vue修改对象的属性值后页面不重新渲染
问题:在页面中展现的列表项,支持多选,所以虽然给列表项增加一个属性isSelected来标记是否选中,但是在动态增加这个属性时,页面却不会更新.
最后在更新对象前使用强制更新

this.$forceUpdate();
this.$set(被更新的对象,"被更新的属性名称",更新后的取值);

3.数据更新,Dom未更新

理解vue中的nextTick
问题:有一个弹框,用isShow控制是否显示,当弹框显示时,只要设置isShow为true即可.为了更好地交互,弹框打开时,弹框里面的第一个输入框就要获取焦点onfouse.根据原生的js写法:

document.querySelector(".my-modal input").focus();

但是并不生效,原因就是vue的DOM更新是异步的.
所以我们使用

this.$nextTick(()=>{
//或者可以使用vue提供的获取dom的方法
 // this.$refs.myInput.focus();
document.querySelector(".my-modal input").focus();
});

以下是vue官方对DOM更新的解读.

Vue 异步执行 DOM 更新。只要观察到数据变化,Vue 将开启一个队列,并缓冲在同一事件循环中发生的所有数据改变。如果同一个 watcher 被多次触发,只会被推入到队列中一次。这种在缓冲时去除重复数据对于避免不必要的计算和 DOM 操作上非常重要。然后,在下一个的事件循环“tick”中,Vue 刷新队列并执行实际 (已去重的) 工作。Vue 在内部尝试对异步队列使用原生的 Promise.then 和MessageChannel,如果执行环境不支持,会采用 setTimeout(fn, 0)代替。
例如,当你设置vm.someData = 'new value',该组件不会立即重新渲染。当刷新队列时,组件会在事件循环队列清空时的下一个“tick”更新。多数情况我们不需要关心这个过程,但是如果你想在 DOM 状态更新后做点什么,这就可能会有些棘手。虽然 Vue.js 通常鼓励开发人员沿着“数据驱动”的方式思考,避免直接接触 DOM,但是有时我们确实要这么做。为了在数据变化之后等待 Vue 完成更新 DOM ,可以在数据变化之后立即使用Vue.nextTick(callback) 。这样回调函数在 DOM 更新完成后就会调用。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,755评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,369评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,799评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,910评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,096评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,159评论 3 411
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,917评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,360评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,673评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,814评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,509评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,156评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,123评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,641评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,728评论 2 351

推荐阅读更多精彩内容

  • 这篇笔记主要包含 Vue 2 不同于 Vue 1 或者特有的内容,还有我对于 Vue 1.0 印象不深的内容。关于...
    云之外阅读 5,046评论 0 29
  • 前言 您将在本文当中了解到,往网页中添加数据,从传统的dom操作过渡到数据层操作,实现同一个目标,两种不同的方式....
    itclanCoder阅读 25,766评论 1 12
  • 1.安装 可以简单地在页面引入Vue.js作为独立版本,Vue即被注册为全局变量,可以在页面使用了。 如果希望搭建...
    Awey阅读 11,005评论 4 129
  • vue概述 在官方文档中,有一句话对Vue的定位说的很明确:Vue.js 的核心是一个允许采用简洁的模板语法来声明...
    li4065阅读 7,195评论 0 25
  • 嫩草镶白钻,晨鸟肚已圆。 途路三千里,蓬莱一尺间。 相顾不相言,留汗落两边。 四海雨露沾,五湖鲈鱼鲜。 但羡嫦娥悬...
    半日浮闲阅读 428评论 0 1