【心无旁骛】vuex-typescript-example
我不惮以最大的赞美去赞美这样的项目,真的是非常有创意又有能力。
先放上我喜欢的这个项目的开源地址:https://github.com/gluons/vuex-typescript-example
我们再看一下项目的效果

这是一个可以存储颜色的取色器呢,刷新页面会发现颜色是有保存的,取色器中的颜色改变,左右两个box的颜色也会改变。
接下来我们来分析代码
main.ts中一般定义全局公共组件和样式等
//main.ts
import Vue from 'vue';
// vuetify: 为移动而生的Vue JS 2.0组件框架
import Vuetify from 'vuetify';
// Vuex store
import store from './store';
// Stylesheets
import 'vuetify/dist/vuetify.min.css';
// Components
import { Sketch } from 'vue-color';
import * as components from './components';
// Views
import Home from './views/Home.vue';
Vue.use(Vuetify);
Object.keys(components).forEach(name => {
Vue.component(name, components[name]);
});
Vue.component('sketch-picker', Sketch);
new Vue({
el: '#app',
store,
render: h => h(Home)
});
接下来看Home.vue页面
Home.vue中还使用了jade的写法,标签都不需要呢~
<template lang="pug">
v-app#home
v-toolbar.purple(dark)
v-toolbar-title #[blank-link(url='https://github.com/vuejs/vuex/') Vuex] with #[blank-link(url='https://www.typescriptlang.org/') TypeScript] example
main
v-content
v-container(fluid, grid-list-xl)
v-layout(row, wrap, align-content-center, justify-space-around)
v-flex(xs12, md3, order-md2)
sketch-picker(:value='colour', @input='updateColor').picker-center
v-flex(xs12, md4, order-md1)
color-box(title='Box 1')
v-flex(xs12, md4, order-md3)
color-box(title='Box 2')
</template>
很有意思的项目啊,当开源者的水平越高超,你能够欣赏到的代码的快感就越强烈,越会有相逢恨晚的感觉
接下来我们看Home.vue中的ts部分
看到引入了
import { Getter } from '@/decorators';
我猜测那个时候,可能还没有装饰器的功能,看到这里将getters封装了一层,好像是将getters变成store的全局变量

让全局可以使用getters函数
Home页面中有一个取色器组件,他有一个updateColor方法
//Home.vue
<template lang="pug">
v-app#home
v-toolbar.purple(dark)
v-toolbar-title #[blank-link(url='https://github.com/vuejs/vuex/') Vuex] with #[blank-link(url='https://www.typescriptlang.org/') TypeScript] example
main
v-content
v-container(fluid, grid-list-xl)
v-layout(row, wrap, align-content-center, justify-space-around)
v-flex(xs12, md3, order-md2)
sketch-picker(:value='colour', @input='updateColor').picker-center
v-flex(xs12, md4, order-md1)
color-box(title='Box 1')
v-flex(xs12, md4, order-md3)
color-box(title='Box 2')
</template>
<script lang="ts">
import Vue from 'vue';
import Component from 'vue-class-component';
import { Getter } from '@/decorators';
@Component({
name: 'Home'
})
export default class Home extends Vue {
@Getter('colour') colour: string;
// Actions 支持同样的载荷方式和对象方式进行分发:
updateColor(newColor) {
let newColorHex: string = newColor.hex;
// newColorHex是deploy是载荷,传递的数据
this.$store.dispatch('updateColor', newColorHex);
}
}
</script>
<style scoped>
#home {
margin-bottom: 1rem;
}
.picker-center {
margin: 0 auto;
}
</style>
我还是很疑问的,因为colorBox并没有在Home.vue中定义,以致于我没有结合colorBox进行分析项目
//src\components\ColorBox.vue
<template lang="pug">
v-card(raised, hover)
v-card-title(primary-title, v-if='hasTitle')
span.title {{ title }}
v-card-text
.color-box(:data-color='colour', :style='boxStyle')
</template>
<script lang="ts">
import Vue from 'vue';
import Component from 'vue-class-component';
import { Getter } from '@/decorators';
@Component({
name: 'ColorBox',
props: {
title: String
}
})
export default class ColorBox extends Vue {
@Getter('colour') colour: string;
title: string;
get hasTitle() {
return !!this.title;
}
get boxStyle() {
return {
'background-color': this.colour
};
}
}
</script>
<style scoped>
.color-box {
width: 150px;
height: 150px;
margin: 0 auto;
}
</style>
//src\components\BlankLink.vue
<template lang="pug">
a(:href='url', target='_blank', rel='noopener noreferrer')
slot
</template>
<script lang="ts">
import Vue from 'vue';
import Component from 'vue-class-component';
@Component({
name: 'BlankLink',
props: {
url: {
type: String,
required: true
}
}
})
export default class BlankLink extends Vue {}
</script>
<style lang="scss" scoped>
a {
&, &:hover, &:visited {
color: inherit;
text-decoration: none;
}
&:hover {
text-decoration: underline;
}
}
</style>
state里面定义color,color是个变量
//src\store\state.ts
import randomColor from 'randomcolor';
export default class State {
public color: string;
constructor() {
this.color = randomColor();
}
}
getters中的color,从原有的定义中取出来
//src\store\getters.ts
import { GetterTree } from 'vuex';
import State from './state';
// GetterTree<[current state], [root state]>
const getters: GetterTree<State, State> = {
/*
* It's just color with new name.
* Example for using getters.
*/
colour(state: State): string {
return state.color;
}
};
export default getters;
mutations同步处理函数
//src\store\mutation-types.ts
export const COLOR = 'COLOR';
//src\store\mutations.ts
import { MutationTree } from 'vuex';
import { COLOR } from './mutation-types';
import State from './state';
const mutations: MutationTree<State> = {
[COLOR](state: State, newColor: string): void {
state.color = newColor;
}
};
export default mutations;
看不懂这个
[COLOR](state: State, newColor: string): void {
state.color = newColor;
}
action是进行异步处理的
//src\store\actions.ts
import { ActionContext, ActionTree } from 'vuex';
import { COLOR } from './mutation-types';
import State from './state';
// ActionTree<[current state], [root state]>
const actions: ActionTree<State, State> = {
updateColor({ commit }: ActionContext<State, State>, newColor: string): void {
commit(COLOR, newColor);
}
};
export default actions;
updateColor这个更新函数,就可以和updateColor进行结合了
【心无旁骛】vuex-typescript-example的更多相关文章
- [Vuex] Use Namespaces in Vuex Stores using TypeScript
Even by using modules, they still share the same namespace. So you couldn’t have the same mutation n ...
- [Vuex] Split Vuex Store into Modules using TypeScript
When the Vuex store grows, it can have many mutations, actions and getters, belonging to different c ...
- [Vuex] Perform Async Updates using Vuex Actions with TypeScript
Mutations perform synchronous modifications to the state, but when it comes to make an asynchronous ...
- [Vuex] Create a Vuex Store using TypeScript
A Vuex store centralizes the state of your app, making it easy to reason about your state flow. In t ...
- Vuex 刷新后数据丢失问题 Typescript
问题描述:Vuex保存的数据在页面刷新后会全部丢失清除 问题解决方案:使用sessionstorage进行保存,在页面刷新时保存至sessionStorage,页面在加载时再进行填充 (另有vue ...
- [Vuex] Lazy Load a Vuex Module at Runtime using TypeScript
Sometimes we need to create modules at runtime, for example depending on a condition. We could even ...
- Vue练手项目(包含typescript版本)
本项目的git仓库https://github.com/lznism/xiachufang-vue 对应的使用typescript实现的版本地址https://github.com/lznism/xi ...
- Vue 爬坑之路(十)—— Vue2.5 + Typescript 构建项目
Typescript 在前端圈已经逐渐普及,Vue 2.5.0 改进了类型声明,使得对 TypeScript 更加友好 不过要想在项目中直接使用 TypeScript 仍然需要对项目进行一些改造 P ...
- 搭建项目vue + vue-router + vuex + vue-i18n + element-ui + egg + sequelize
vue + vue-router + vuex + vue-i18n + element-ui + egg + sequelize https://www.cnblogs.com/wuguanglin ...
- Vue2.5 Web App 项目搭建 (TypeScript版)
参考了几位同行的Blogs和StackOverflow上的许多问答,在原来的ng1加TypeScript以及Webpack的经验基础上,搭建了该项目,核心文件如下,供需要的人参考. package.j ...
随机推荐
- [JZOJ4665] 【GDOI2017模拟7.21】数列
题目 题目大意 给你一个数列,让你找到一个最长的连续子序列,满足在添加了至多KKK个数之后,能够变成一条公差为DDD的等差数列. 思考历程 一眼看上去似乎是一道神题-- 没有怎么花时间思考,毕竟时间都 ...
- 列表中的index,extend,count方法
列表中的index,extend,count方法 #_author:Administrator#date:2019/10/24#1.index方法l=['blue','red','white','bl ...
- C++Builder常用函数
BCB函数集 1.内存分配 函数名称 AllocMem 函数说明 在队中分配指定字节的内存块,并将分配的每一个字节初始化为 0.函数原型如下: void * __fastcall AllocM ...
- Django项目:堡垒机(Linux服务器主机管理系统)--02--02堡垒机设计后台交互程序
#main.py #本文件写所有的连接交互动作程序 #————————————————02堡垒机设计后台交互程序 开始———————————————— from django.contrib.auth ...
- sprintf、fprintf和printf这三个函数有什么区别?
都是把格式好的字符串输出,只是输出的目标不一样:1 printf,是把格式字符串输出到标准输出(一般是屏幕,可以重定向).2 sprintf,是把格式字符串输出到指定字符串中,所以参数比printf多 ...
- Delphi代码创建形式规范 1.0
Delphi代码创建形式规范 1.0 本规范的目的:给自己的代码一个统一而标准的外观,增强 可读性,可理解性,可维护性 本规范的原则:名称反映含义,形式反映结构 1.单元风格 ...
- FastJSON实现详解
摘要:“快”作为程序员追逐的终极目标之一,而FastJSON则很好的证明了这一特性.本期<问底>,静行将带大家见证它序列化和反序列化的实现过程,一起领略它的“快”感. 还记得电影<功 ...
- vue 绑定多个class
<div :class="[box,shadow]"></div> 或 :后面跟条件,条件成立则添加class,否则不添加 :class="[{' ...
- day 64 Django基础十之Form和ModelForm组件
Django基础十之Form和ModelForm组件 本节目录 一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 Mod ...
- DEDECMS织梦后台更新网站栏目无反应一键更新无响应的解决方法
很多站长朋友反应,经常会遇到DEDECMS织梦后台更新网站栏目无反应和一键更新无响应的问题,这个问题的所在就是在于恢复了数据或者覆盖了织梦后台文件之后,点击一键更新完全没反应,或者生成栏目的时候其他都 ...