为了账号安全,请及时绑定邮箱和手机立即绑定

vue注册了全局方法,调用的时候获取不到怎么办

vue注册了全局方法,调用的时候获取不到怎么办

慕森王 2019-03-12 17:14:36
这是打印的Vue.prototype,和this.$moment();以下是main.js中的代码import moment from 'moment';Object.defineProperty(Vue.prototype, '$moment', { value: moment });// Vue.prototype.$moment=moment;console.log(Vue.prototype);console.log(this.$moment());根据楼上大神所说,main.js直接打印this.$moment 跟在组件中this.$moment的this不是一个this,应该直接在组件中输入,我试了下,确实可以在组件中输出console.log(this.$moment());但是使用相关的方法依然不生效:created(){      console.log(this.$moment());      this.$moment.locale('zh-cn');    },    filters:{      formatTime(time){        return this.$moment(time).fromNow();      },    },
查看完整描述

6 回答

?
翻阅古今

TA贡献1780条经验 获得超5个赞

在组件中可以使用 this.$moment() 这种方式调用,在 main.js中是不行的,这时候this指向window,你可以使用 Vue.prototype.$moment() 这样的方式调用


查看完整回答
反对 回复 2019-03-28
?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

在main.js引入:

https://img1.sycdn.imooc.com//5c9c23950001fb0103380028.jpg

https://img1.sycdn.imooc.com//5c9c239500015f2c02870028.jpg

在组件中引用:

https://img1.sycdn.imooc.com//5c9c239700019f9d05000026.jpg


查看完整回答
反对 回复 2019-03-28
?
qq_遁去的一_1

TA贡献1725条经验 获得超7个赞

看了下报错信息,应该是this的取值不对。 看看有没有在选项中(钩子函数 or data or watch or computed)用了箭头函数。没有具体的代码只能想到这个了。

试了一下,在filters中this不是vue实例。建议通过computed属性来实现你的需求。

搜了下相关信息:尤大原话

This is intentional in 2.x. Filters should be pure functions and should not be dependent on this context. If you need this you should use a computed property or just a method e.g. $translate(foo)

简单来说就是vue2+是故意不给你在filters里取到this的~


查看完整回答
反对 回复 2019-03-28
?
三国纷争

TA贡献1804条经验 获得超7个赞

单页面组件开发时,Vue 不是一个全局对象,它只在 main.js 上可以直接访问。可以在 main.js 中把 Vue 挂在window下,如下:


import moment from 'moment';

Object.defineProperty(Vue.prototype, '$moment', { value: moment });

// Vue.prototype.$moment=moment;

console.log(Vue.prototype);

console.log(this.$moment());

window.Vue = Vue;


查看完整回答
反对 回复 2019-03-28
?
慕少森

TA贡献2019条经验 获得超9个赞

  1. 打印出 this,就在里面找啊;

  2. 找不到?那肯定是没绑定了;

  3. 想用 this调用,肯定要绑定到原型链上,

  4. 那就去 main.js 绑定,Vue.prototype.moment = moment

  5. 导入组件后this.moment调用


查看完整回答
反对 回复 2019-03-28
?
holdtom

TA贡献1805条经验 获得超10个赞

楼上 faymi 的回答很对。
除此之外,楼主还可以在每个组件中按需导入,直接使用即可,比如在 ChildA.vue中,
import moment from "moment";
console.log(moment('2018-04-16').toDate());

查看完整回答
反对 回复 2019-03-28
  • 6 回答
  • 0 关注
  • 5710 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信