最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • typescript在vue2项目中的使用方法

    正文概述 掘金(胡九筒)   2021-01-18   800

    项目配置在此不再做说明,本文是为了让新手更快熟悉ts在vue2.x中的使用。

    以下默认读者已掌握vue的基础开发。

    一、vue模板设置

    在改造.vue文件前,我们需要安装一个插件vue-property-decorator

    为了让webpack把script内的代码识别为ts,除了需要改造一下script标签内的内容,其他地方都无需修改

    <script lang="ts">
    </script>
    

    二、常用装饰器的使用

    装饰器用于扩展类或者它的属性和方法。@xxx就是装饰器的写法

    常见的有@Prop,@Emit,@Watch等等

    <script lang="ts">
    import { Component, Vue, Watch  } from 'vue-property-decorator';
    @Component()
    export default class Home extends Vue {
        // data中的参数   
        private str: boolean = 'aaa';  
            //  Watch --> 监听
        @Watch('config')  
        onConfigChange(val: any, oldVal: any) {    
        }
     
      //  生命周期直接用同名方法即可,mounted同理
        private created(){
            this.init();
        }
     
      // 方法 --> 相当于methods中的方法
        private init(){
            console.log('init');
        }
            // 访问器当做计算属性 --> 相当于computed
            //computed: {
        //  count() { 
        //    return this.str.length
        //  }
        //}
        get count() {
          return this.str.length
        }
    }
    </script>
    

    三、组件引入方式

    在导入vue文件的时候,要写上.vue后缀,因为TypeScript默认识别ts文件

    <script lang="ts">
        import Test from './test.vue'; // 引入Test组件
        import { Component, Prop, Vue, Watch  } from 'vue-property-decorator';
        
      @Component({    
          components: {      
              Test    
          }
      })
        export default class Home extends Vue {
        // xxx
      }
    </script>
    

    四、父子组件通信

    众所周知,父 -> 子 传值,子组件通过props接收参数, 子 -> 父组件 通过emit 传值

    在ts中如下:

    子组件HelloWorld

    <template>
      <div>
        <h1>HelloWorld 组件</h1>
        <div>父组件传值{{ msg }}</div>
        <el-button @click="onClick">点我向父组件传值</el-button>
      </div>
    </template>
    
    <script lang="ts">
    import { Component, Emit, Prop, Vue } from 'vue-property-decorator'
    
    @Component
    export default class HelloWorld extends Vue {
      // 括号中的是传给vue的配置
      // ts特性展示,!是赋值断言,表示该属性一定会被赋值,编译器不用警告
      @Prop({ type: String, required: true }) private msg!: string
    
      clickCount: number = 0 // ts自带类型推断,也可写为 clickCount = 0
    
      @Emit()  // 回调函数直接声明即可
        // 或 @Emit('on-click') 
      onClick() {
        this.clickCount += 1
        return this.clickCount
      }
    }
    </script>
    

    父组件Home

    <template>
      <div class="home">
        <el-input v-model="msg"></el-input>
            // 传值与js版本无异
        <HelloWorld :msg="msg" @on-click="onChildClick" />
      </div>
    </template>
    
    <script lang="ts">
    import { Vue, Component, Watch } from 'vue-property-decorator'
    import HelloWorld from '@/components/HelloWorld.vue'
    @Component({
      components: {
        HelloWorld,
      },
    })
    export default class Home extends Vue {
      // data
      msg = 'aaa'
      onChildClick(e: number) {
        console.log('child:', e)
      }
    }
    </script>
    

    五、状态管理

    在js版本中,我们一般使用vuex来做状态管理,ts中,我们可用`vuex-module-decorators`做状态管理

    import { Module, VuexModule, Mutation, Action, getModule } from 'vuex-module-decorators'
    import store from './index'
    // 动态注册模块设置,跟js类似
    @Module({ store: store, name: 'counter', namespaced: true }) 
    class CounterModule extends VuexModule {
        count = 1
      @Mutation
      add() {
        // 通过this直接访问count
        this.count++
      }
    // 定义getters
        get doubleCount() {
        return this.count * 2;
      }
      @Action
      asyncAdd() {
            setTimeout(() => {
                // 通过this直接访问add this.add()
            }, 1000);
     
        }
    }
    // 导出模块应该是getModule的结果
    export default getModule(CounterModule)
    
    
    // 在组件中使用
    <template>
      <p @click="add">{{$store.state.counter.count}}</p>
        <p @click="asyncAdd">{{count}}</p>
    </template>
    
    <script lang="ts">
      import CounterModule from '@/store/counter'
      @Component
      export default class Home extends Vue {
        get count() {
          return CounterModule.count
        }
        add() { // 相当于js版本中 this.$store.commit('count/add')
          CounterModule.add()
        }
        asyncAdd() { // 相当于js版本中 this.$store.dispatch('count/add')
          CounterModule.asyncAdd()
        } 
      }
    </script>
    

    起源地下载网 » typescript在vue2项目中的使用方法

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元