崮生
崮生
  • 发布:2020-07-23 15:29
  • 更新:2021-04-28 14:13
  • 阅读:3859

composition-api 在 uni-app 微信小程序中的使用

分类:uni-app

一开始我按照 composition-api 官方文档 中所说的引入 import VueCompositionAPI from "@vue/composition-api"; 然后使用 Vue.use(VueCompositionAPI); 在开发模式下一切完美。

但编译之后就不行了,在网上找到了 https://github.com/dcloudio/uni-app/issues/1839 ,里面有我的解决方案,但修改 npm 包终究不太好,刚刚终于研究出了在main.js 中使用一段代码解决这个问题的方法

  /** uni-app composition api补丁 */ (() => {  
    /** uni-app 会在 beforeUpdate 的时候调用这个函数来进行和微信进程数据的交换 */  
    const oldPatch = Vue.prototype.__patch__ as Function;  
    Vue.prototype.__patch__ = function(...arg: any) {  
      补丁(this);  
      oldPatch.call(this, ...arg);  
    };  

    function 补丁(vm: any) {  
      if (vm._computedWatchers === undefined) {  
        vm._computedWatchers = {};  
      }  
      const ret = vm._data;  
      var rawBindings = getRawBindings(vm);  
      if (rawBindings) {  
        Object.keys(rawBindings).forEach(function(key) {  
          // && vm.mpType === "component"  
          if (config.is_dev) {  
            /** 开发版补丁 */  
            const v = rawBindings[key];  
            // console.log("[ret[key]] " + key, ret[key], v);  
            if (isRef(v)) {  
              if (isReadonly(v)) {  
                /**  只读的值一般是计算属性,所以放到computed中,要是放到data中uni-app会尝试写,这样导致报错 */  
                vm._computedWatchers[key] = v;  
              } else {  
                ret[key] = v.value;  
              }  
            } else {  
              ret[key] = v;  
            }  
          } else {  
            /** 编译版补丁 */  
            ret[key] = undefined;  
          }  
        });  
      }  
    }  
    function getRawBindings(vm: any) {  
      return vm.__composition_api_state__ && vm.__composition_api_state__.rawBindings;  
    }  
  })();

只需要在加上这段代码即可编译后也能正常使用 composition-api 了。composition-api 真滴香

4 关注 分享
fightingcat 9***@qq.com 囧粉 毛学生

要回复文章请先登录注册

毛学生

毛学生

回复 毛学生 :
https://github.com/TuiMao233/uni-composition-api
2021-04-28 14:13
毛学生

毛学生

我整了个npm包,修复了这个问题,并且提供了生命周期回调,大伙想方便点可以用我这个
2021-04-28 14:13
毛学生

毛学生

好啊,这舒服了
2021-03-20 11:40
崮生

崮生 (作者)

回复 1***@qq.com :
赞,忘了改 config 相关的代码了
2020-12-25 09:38
1***@qq.com

1***@qq.com

```js

import VueCompositionApi, { isRef, isReadonly } from '@vue/composition-api'
import App from './App'
import store from '@/store/store.js'

/** uni-app composition api补丁 */
(() => {
/** uni-app 会在 beforeUpdate 的时候调用这个函数来进行和微信进程数据的交换 */
const oldPatch = Vue.prototype.__patch__;
Vue.prototype.__patch__ = function(...arg) {
pach(this);
oldPatch.call(this, ...arg);
};

function pach(vm) {
if (vm._computedWatchers === undefined) {
vm._computedWatchers = {};
}
const ret = vm._data;
var rawBindings = getRawBindings(vm);
if (rawBindings) {
Object.keys(rawBindings).forEach(function(key) {
// && vm.mpType === "component"

if (process.env.NODE_ENV === 'development') {
/** 开发版补丁 */
const v = rawBindings[key];
if (isRef(v)) {
if (isReadonly(v)) {
/** 只读的值一般是计算属性,所以放到computed中,要是放到data中uni-app会尝试写,这样导致报错 */
vm._computedWatchers[key] = v;
} else {
ret[key] = v.value;
}
} else {
ret[key] = v;
}
} else {
/** 编译版补丁 */
ret[key] = undefined;
}
});
}
}

function getRawBindings(vm) {
return vm.__composition_api_state__ && vm.__composition_api_state__.rawBindings;
}
})();


```

改了下你的代码... 有几个地方报错...
2020-12-18 00:59
1***@qq.com

1***@qq.com

```js
VM1380 WAService.js:2 MiniProgramError
config is not defined
ReferenceError: config is not defined
```
2020-12-18 00:50
1***@qq.com

1***@qq.com

老哥你这个中文 补丁 过分了啊23333
2020-12-18 00:36
崮生

崮生 (作者)

回复 9***@qq.com :
我更新了一下代码,你可以使用这个试试
2020-10-16 16:22
9***@qq.com

9***@qq.com

我复制了这段代码还是无效的的,修改时,视图不会更新,请问我是不是还有其他地方没有配置好
2020-09-26 23:00