这代码有问题吗,为什么网页执行不出来

  • 多个页面都使用的到方法放在 vue.prototype 仩会很方便

    刚接触 vue 的时候做过一件傻事,因为封装了一个异步请求接口post,放在 post.js 文件里面然后在每个需要使用异步请求的页面引入

    如果只是這样,还没什么我们可以写好一个页面以后再复制,可以保证每个页面都有上面的语句但是如果每个文件所在的目录层级不一样呢?

    // 目录加深一级就变成这样 // 再加深一级的样子

    当然,这个时候我们可以用 别名 @/xxxx/post,但是还是少不了要每个页面引用。

    这样我们就可以在所囿的 vue 组件(页面)里面使用 this.post() 方法了,就像 vue 的亲儿子一样

    tip: 把方法挂在到 prototype 上的时候最好加一个 $ 前缀,避免跟其他变量冲突

    til again: 不要挂载太多方法箌 prototype 上只挂载一些使用频率非常高的

  • 需要响应的数据,在获取到接口数据的时候先设置

    大家有没有很经常碰到这样都一种情况,在循环列表的时候我们需要给列表项一个控制显示的属性,如 是否可删除是否已选中等等,而后端接口一般不会返回这种字段因为这属于純前端展示的,跟后端没啥关系比如后端给的数据如下

    我们不妨假设以上数据为学生列表

    然后我们需要渲染这个列表,在每一项后面显礻一个勾选按钮如果用户打勾,则这个按钮是绿色默认这个按钮是灰色,这个时候上表是没有满足这个渲染条件的数据,而如果我們在用户打勾的时候再去添加这个数据的话,正常的做法是无法及时响应的

    如果我们在获取到数据的时候,先给数组的每一项都加一個是否打勾的标示就可以解决这个问题,我们假设我们获取到的数据是 res.list

    这么做的原理是 vue 无法对不存在的属性作响应所以我们在获取到數据的时候,先把需要的属性加上去然后在赋值给 data , 这样 data 接收到数据的时候,已经是存在这个属性了所以会响应。当然还有其他方法可鉯实现不过对于一个强迫症来说,我还是比较倾向于这种做法

  • 封装全局基于 promise 的异步请求方法

    看过很多项目的源码发现大部分的异步请求都是直接使用 axios 之类的方法,如下

    如果有跨域或者需要设置 http 头等,还需要加入更多的配置而这些配置,对于同一个项目来说基本都昰一样的,不一样的只有 url 跟参数既然这样,那我吗为什么不把它封装成一个方法呢

    tip: 这里原来我多用了一层promise包起来,对简单的需求来说是呔多余了,感觉掘金用户 @日月为易。 指出

    再结合第一点我们就可以再任意 vue 实例中这样使用

    有没有比原始的简单很多呢?如果你的项目支持 async await还可以这样用

  • 如果你觉得有时候,你真的需要父子组件共享一个值不如试试传个引用类型过去

    vue 的父子组件传值,有好多种方法这里僦不一一列举了,但是今天我们要了解的是利用 javascript 的引用类型特性,还达到另一种传值的目的

    假设有这么一个需求父组件需要传 3 个值到孓组件,然后再子组件里面改动后需要立马再父组件上作出响应,我们通常的做法上改完以后通过 this.$emit 发射事件,然后再父组件监听对应嘚事件然而这么做应对一两个数据还好,如果传的数据多了会累死人。
    我们不妨把这些要传递的数据包再一个对象/数组 里面,然後在传给子组件

    这样我们在子组件里面改动 subData 的内容,父组件上就能直接作出响应无需 this.$emitvuex 而且如果有其他兄弟组件的话,只要兄弟组件吔有绑定这个 subData 那么兄弟组件里面的 subData 也能及时响应

    tip: 首先,这么做我个人上感觉有点不符合规范的如果没有特别多的数据,还是乖乖用 this.$emit 吧其次,这个数据需要有特定的条件才能构造的出来并不是所有情况都适用。
  • 异步请求的参数在 data 里面构造好用一个对象包起来,会方便很多

    有做过类似 ERP 类型的系统的同学一定碰到过这样的一个场景,一个列表有 N 个过滤条件,这个时候通常我们这么绑定

    然后提交数据嘚时候这样:

    如你看到的每次提交接口,都要去构造参数还很容易遗漏,我们不妨这样:先去接口文档里面看一下后端需要的字段名稱然后

     
     然后提交数据的时候这样:
     
    是的,这样做也是有局限性的比如你一个数据在 2 个地方共用,比如前端组件绑定的是一个数组你需要提交给后端的是 2 个字符串(例:element ui 的时间控件),不过部分特殊问题稍微处理一下,也比重新构建一个参数简单不是吗
  • data 里面的数据多的時候,给每个数据加一个备注会让你后期往回看的时候很清晰

    续上一点,data 里面有很多数据的时候可能你写的时候是挺清晰的,毕竟都昰你自己写的东西可是过了十天半个月,或者别人看你的代码相信我,不管是你自己还是别人,都是一头雾水(记忆力超出常人的除外)所以我们不妨给每个数据后面加一个备注

  • 逻辑复杂的内容,尽量拆成组件

    假设我们有一个这样的场景:

    这种情况我们不妨把[用戶]的代码,提取到一个组件里面:

    然后原来的页面可以改成这样(省略掉导入和注册组件假设注册的名字是 comUserInfo ):

    这样是不是清晰很多?不用看注释都能猜的出来,这是2个用户信息模块 这样做,还有一个好处就是出现错误的时候你可以更容易的定位到错误的位置。

  • 如果你呮在子组件里面改变父组件的一个值不妨试试 $emit('input') ,会直接改变 v-model

    但是这边有个特例,vue 默认会监听组件的 input 事件而且会把子组件里面传出来的值,赋给当前绑定到 v-model 上的值

    这样我们就能省掉父组件上的一列席处理代码,vue 会自动帮你处理好

    tip: 这种方法只适用于改变单个值的情况且子組件对父组件只需简单的传值,不需要其他附加操作(如更新列表)的情况

    该方法,个人认为比较适用于 要更新的数据不能绑定在 v-model 的情况下,或鍺要双向通信的数据大于 1 个(1个也可以用,但我个人更推荐 input 的方式, 看个人喜好吧),但又不会很多的情况下.

  • 不知道大家有没有这样的经历: 导入组件,然后在也页面中使用好的,报错了为啥?忘记注册组件了为什么会经常忘记注册组件呢?因为正常的一个 vue 实例的结构大概是这样嘚:

    // ...根据业务逻辑的复杂程度这里省略若干行 // ...根据业务逻辑的复杂程度,这里省略若干行 // ...根据业务逻辑的复杂程度这里省略若干行 // ...根據业务逻辑的复杂程度,这里省略若干行 // ...根据业务逻辑的复杂程度这里省略若干行

    我不知道大家正常是把 components 属性放在哪个位置,反正我之湔是放在最底下结果就是导致经常犯上述错误。

    从此以后妈妈再也不用担心我忘记注册组件了,导入和注册都在同一个位置想忘记嘟难。

  • 大部分情况下生命周期里面,不要有太多行代码可以封装成方法,再调用

    看过很多代码包括我自己之前的,在生命周期里面洋洋洒洒的写了一两百行的代码如:把页面加载的时候,该做的事全部写在 created 里面,导致整个代码难以阅读完全不知道你在页面加载嘚时候,做了些什么
    这个时候,我们不妨把那些逻辑封装成方法然后在生命周期里面直接调用:

    这样是不是一眼就能看的出,你在页媔加载的时候做了些什么

    tip: 这个应该算是一个约定俗成的规范吧,只是觉得看的比较多这样写的加上我自己初学的时候,也这么做了所以写出来,希望新入坑的同学能避免这个问题
  • 少用 watch如果你觉得你好多地方都需要用到 watch,那十有八九是你对 vueAPI 还不够了解

    vue 本身就是一个數据驱动的框架数据的变动,能实时反馈到视图上去如果你想要根据数据来控制试图,正常情况一下配合 computed 服用就能解决大部分问题了而视图上的变动,我们一般可以通过监听 input change 等事件达到实时监听的目的,
    所以很少有需求使用到 watch 的时候,至少我最近到的十来个项目里面是没有用过 watch 当然,并不是说 watch 是肯定没用处, vue 提供这个api,肯定是有他的道理也有部分需求是真的需要用到的,只是我觉得应该很少用到才对如果你觉得到处都得用到的话,
    那么我觉得 十有八九你应该多去熟悉一下 computedvue 的其他 api

}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信