# gowiny-vue-class **Repository Path**: gowiny/vue-class ## Basic Information - **Project Name**: gowiny-vue-class - **Description**: 此项目是Vue3 的 TypeScript Class 支持项目,支持普通vue 3 项目和 uniapp + vue3 项目 用类的形式编写组件,面向对象(OOP)编程,并提供了常用的装饰器,还可以自定义装饰器 - **Primary Language**: TypeScript - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-07-11 - **Last Updated**: 2025-03-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # goinwy-vue-class ## 说明 此项目是Vue3 的 TypeScript Class 支持项目,支持普通vue 3 项目和 uniapp + vue3 项目 用类的形式编写组件,面向对象(OOP)编程,并提供了常用的装饰器,还可以自定义装饰器 不依赖 `vue-class-component`项目 觉得它的实现方式,跟正常的Class 的用法不一致,所以直接重写了。 `vue-class-component` 的用法,如果子类也写有生命周期的hook,那实际是所有父类的hook 和 子类的 hook 都会执行一次。 此项目,子类重写父类方法后,如果不显式调用super.xxx 的话,是不会执行父类的hook 的。这跟正常的类的继承、重写保持一致 ### 详细使用方法,可以查看演示项目 演示项目地址:https://gitee.com/gowiny/uni-example ## 安装教程 ### 安装: ``` npm install @gowiny/vue-class ``` ### 初始化 * main.ts ```javascript import vueClass from '@gowiny/vue-class' import { createSSRApp } from "vue"; import App from "./App.vue"; export function createApp() { const app = createSSRApp(App); //如果是 Vue Router 项目,则添加 Vue Router 独有的生命周期钩子 app.use(vueClass,{ hooks:['beforeRouteEnter','beforeRouteUpdate','beforeRouteLeave'] }) //如果是uniapp 项目,则添加uniapp独有的生命周期钩子 /* app.use(vueClass,{ hooks:['onInit','onLoad','onShow','onReady','onHide','onUnload','onResize','onPullDownRefresh','onReachBottom','onTabItemTap','onShareAppMessage','onPageScroll','onNavigationBarButtonTap', 'onBackPress','onNavigationBarSearchInputChanged','onNavigationBarSearchInputConfirmed','onNavigationBarSearchInputClicked','onShareTimeline','onAddToFavorites'] }) */ return { app, }; } ``` ### 使用方法一: 单独使用 ` ``` ### 使用方法二: ` ``` ## 可自定义装饰器 提供灵活的自定义装饰器的方法:`createDecorator` **具体使用方法,请参考源码中已有的装饰器的定义方式** `createDecorator`方法里的参数:`ctx : OptionsContext` 可以通过设置 `ctx.dataFactory` 、`ctx.beforeHandle` 、`ctx.afterHandle` 来修改默认实现 ## 支持的装饰器 ```javascript @Options @Prop @State @Action @Mutation @Getter @Provide @Inject @Watch ``` ### @Prop ```javascript export default class App extends Vue { @Prop declare readonly title:string } ``` 等同于 ```javascript export default defineComponent( { name: 'App', props:['title'] }) ``` ------------ ```javascript export default class App extends Vue { @Prop({ default:'hello gowiny!' }) declare readonly title:string } ``` 等同于 ```javascript export default defineComponent( { name: 'App', props:{ title:{ default:'hello gowiny!' } } }) ``` ------------ ### @State ```javascript export default class App extends Vue { @State declare readonly appName:string } ``` 等同于 ```javascript export default defineComponent( { name: 'App', computed:{ appName(){ this.$store.state.appName } } }) ``` ------------ ```javascript export default class App extends Vue { @State("app.version") declare readonly appVersion:string } ``` 等同于 ```javascript export default defineComponent( { name: 'App', computed:{ appVersion(){ this.$store.state.app.version } } }) ``` ### @Action ```javascript export default class App extends Vue { @Action saveScreenSize!:(screenSize:any)=>Promise } ``` 等同于 ```javascript export default defineComponent( { name: 'App', methods:{ saveScreenSize(screenSize:any):Promise{ return this.$store.dispatch("saveScreenSize",screenSize) } } }) ``` ------------ ```javascript export default class App extends Vue { @Action("app/saveScreenSize") saveScreenSize!:(screenSize:any)=>Promise } ``` 等同于 ```javascript export default defineComponent( { name: 'App', methods:{ saveScreenSize(screenSize:any):Promise{ return this.$store.dispatch("app/saveScreenSize",screenSize) } } }) ``` ### @Inject ```javascript export default class App extends Vue { @Inject getScreenSize!:()=>any } ``` 等同于 ```javascript export default defineComponent( { name: 'App', inject: ['getScreenSize'] }) ``` ------------ ```javascript export default class App extends Vue { @Inject getScreenSize(){ return {width:800,height:600} } } ``` 等同于 ```javascript export default defineComponent( { name: 'App', inject: {'getScreenSize':{ default:function(){ return {width:800,height:600} } }} }) ``` ------------ ```javascript export default class App extends Vue { @Inject("screenWidth") width:number } ``` 等同于 ```javascript export default defineComponent( { name: 'App', inject:{ width:{ from:'screenWidth' } } }) ``` ------------ ```javascript export default class App extends Vue { @Inject({from:'screenWidth',default:800}) width!:number } ``` 等同于 ```javascript export default defineComponent( { name: 'App', inject: { width:{ from:'screenWidth', default:800 } } }) ``` #其他装饰器的用法都类似,不再一一举例