polyfill-nvue.js 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import Vue from 'vue';
  2. const companyUserIsLogin = () => {
  3. try {
  4. const companyUser = uni.getStorageSync('companyUser');
  5. return !!companyUser && companyUser !== '';
  6. } catch (e) {
  7. return false;
  8. }
  9. };
  10. // 针对 nvue (Weex) 环境下 Vuex 4 兼容性修复
  11. // Vuex 4 依赖 Vue 3 的 effectScope, reactive, computed 等 API
  12. // 而 nvue (基于 Weex/Vue 2) 缺失这些 API
  13. try {
  14. // Polyfill global helpers
  15. if (Vue) {
  16. if (!Vue.prototype.$companyUserIsLogin) {
  17. Vue.prototype.$companyUserIsLogin = companyUserIsLogin;
  18. }
  19. if (!Vue.prototype.$isIos) {
  20. Vue.prototype.$isIos = function() {
  21. return uni.getSystemInfoSync().platform === 'ios';
  22. };
  23. }
  24. }
  25. // 1. effectScope
  26. if (Vue && !Vue.effectScope) {
  27. // console.log('Polyfilling effectScope for nvue...', new Date().getTime());
  28. Vue.effectScope = function() {
  29. return {
  30. run: function(fn) { return fn ? fn() : undefined; },
  31. stop: function() {}
  32. };
  33. };
  34. }
  35. // 2. computed
  36. // Vuex 4 使用 computed(() => ...) 创建 getter,返回一个 ref 对象
  37. // 之前的 polyfill 直接执行 getter() 导致在 store 初始化完成前访问 state 报错
  38. // 修复:返回一个包含 lazy value getter 的对象
  39. if (Vue && !Vue.computed) {
  40. Vue.computed = function(getter) {
  41. return {
  42. get value() {
  43. return getter();
  44. }
  45. };
  46. };
  47. }
  48. // 3. reactive
  49. // Vuex 4 使用 reactive(state)
  50. // Vue 2 可以使用 Vue.observable 替代
  51. if (Vue && !Vue.reactive) {
  52. Vue.reactive = function(obj) {
  53. // Vue 2 observable 如果传入响应式对象会返回它本身
  54. return Vue.observable(obj);
  55. };
  56. }
  57. // 4. ref (Vuex 4 可能用到)
  58. // 简单模拟 ref,Vue 2 没有真正的 ref,这里返回一个响应式对象 wrapper
  59. if (Vue && !Vue.ref) {
  60. Vue.ref = function(val) {
  61. const wrapper = { value: val };
  62. return Vue.observable(wrapper);
  63. };
  64. }
  65. } catch (e) {
  66. console.error('Polyfill failed:', e);
  67. }
  68. export default {};