MVC思想

2020-02-23  本文已影响0人  郑馋师

2020.3.3
后续更新
在后续操作中,我们建立了一个store来管理所有的要用到的操作,包括对于Tag的操作和数据的操作Record,再进一步的封装目的是为了减少后续开发者要考虑的问题,他们不需要考虑从哪里引入,因为都是从store里面引入就好

import recordStore from '@/store/recordStore';
import tagStore from '@/store/tagStore';

const store = {
  //record store
  ...recordStore,
//Tag store
  ...tagStore
};
export default store;

同时把store里面封装的api名字更正的更加贴合其操作本身,增加代码可读性
例如把tagListModel里面的save改成了saveTag,这样就知道是对谁进行操作,同时把
tagListModel改成了tagStore,更加贴切


在做项目的时候,我发现如果不用mvc思想而是把东西堆在一起写,会导致组件很臃肿
所以我选择在文件中创建一个model封装有关于数据的操作,然后引入这个model,会使得整个组件舒服多了
以我做的为例子

//tagListModel.ts

const localStorageKeyName = 'tagList';
type TagListModel= {
  data: string[]
  fetch: () => string[]
  create: (name: string) => string
save:()=>void
}
const tagListModel = {
  data:[],
  create(name:string){
    const x=this.data as string[]
    if(x.indexOf(name)>=0){return 'duplicated'}
    x.push(name)
    this.save()
    return 'success'
  },
  fetch() {
    return JSON.parse(window.localStorage.getItem(localStorageKeyName) || '[]') ;
  },
  save() {
    window.localStorage.setItem(localStorageKeyName, JSON.stringify(this.data));
  },
};
export default tagListModel;

我把label中要用的关于数据的操作放在这
所以我的label组件就可以直接调用很方便

//label.vue

<script lang="ts">
import Vue from "vue";
import tagListModel from '@/model/tagListModel';
import {Component} from 'vue-property-decorator';
tagListModel.fetch()
@Component

export default class Labels extends Vue{
  tags=tagListModel.data

  goBack(){}
  createTag(){
    const name=window.prompt('请输入标签名')
    if(name){
     const message=tagListModel.create(name)
      if(message==='duplicated'){
        window.alert('重复')
      }
    }
  }

};
</script>

所以以后要记得养成封装的好习惯

上一篇下一篇

猜你喜欢

热点阅读