【心无旁骛】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: 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进行结合了

原文地址:https://www.cnblogs.com/smart-girl/p/11251532.html

时间: 2024-10-17 14:28:02

【心无旁骛】vuex-typescript-example的相关文章

[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 this lesson we’ll see how we can create a Vuex store using TypeScript and use it on you class-based component by using the @State decorator from Vuex C

vue + ts Vuex篇

Vuex对Typescript的支持,仍十分薄弱,官方库只是添加了一些.d.ts声明文件,并没有像vue 2.5这样内置支持. 第三方衍生库 vuex-typescript, vuex-ts-decorators, vuex-typex, vuex-class等等,我个人的总结,除了vuex-class外,基本都存在侵入性太强的问题,引用不算友好.而vuex-class提供的功能其实也是薄薄一层,并不能解决核心痛点.因此,需要手动添加辅助的地方,其实颇多. 核心痛点:每次调用 this.$sto

【前端vue进阶实战】:从零打造一个流程图、拓扑图项目【Nuxt.js + Element + Vuex】 (一)

本系列教程是用Vue.js + Nuxt.js + Element + Vuex + 开源js绘图库,打造一个属于自己的在线绘图软件,最终效果:topology.le5le.com .如果你觉得好,欢迎给文章和开源库点赞,让我们更有动力去做好! 本系列教程源码地址:Github 一.创建项目框架 1. 使用Nuxt.js向导创建项目 yarn create nuxt-app topology-vue // 注意在后面提示中,上移下移,按空格选中 Element 复制代码 选择Element后,在

almost最好的Vue + Typescript系列02 项目结构篇

基于vue-cli 3.x,配合typescript的环境构建的新vue项目,跟以前的结构相比,有了一些变化,下面我们来简单的了解一下 基本结构: node_modules: 项目中安装的依赖模块 public: 主页文件index.html && favicon.icon(将以往单独在外部的index.html移到了public文件夹下),index.html我们可以像平时普通的html文件一样引入文件(css,js)和书写基本信息,添加meta标签等. src: 源码文件夹,基本上我们

vuex实践示例

前言 Vuex的文档翻了几遍,依然只会最简单的用法.对其更多的功能不太了解.这次因为重新开始一个前后端分离项目,我希望使用vue+typescript,这时就涉及到ts版的vuex,才发现自己vuex都不懂,如何ts化呢?于是再次从0开始学一遍vuex. 这次有个意外的发现,在Vuex官方文档 核心概念 - 项目结构 最后一行有句 请参考购物车示例,点击打开了github vuex项目,发现里面有很多examples.于是下载下来,一个一个学习.刚开始就是照抄代码.网上很多大神都说抄代码没用,但

Vue CLI 3搭建vue+vuex 最全分析

一.介绍 Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统.有三个组件: CLI:@vue/cli 全局安装的 npm 包,提供了终端里的vue命令(如:vue create .vue serve .vue ui 等命令) CLI 服务:@vue/cli-service是一个开发环境依赖.构建于 webpack 和 webpack-dev-server 之上(提供 如:serve.build 和 inspect 命令) CLI 插件:给Vue 项目提供可选功能的 npm 包 (如

应用十:Vue之Vue与TypeScript集成开发

截至2019年底,TypeScript(简称ts)已经与Python并列成为第二受欢迎的开发语言,仅次于Rust.如果你还不清楚到底什么是ts,请先移步至ts中文网了解.再过几个月Vue3.0版本就将正式发布,源码完全使用TypeScript编写,Vue与TypeScript的集成势必将成为接下来的趋势. 鉴于手头刚好有一个新项目要做,就想着提前先体验一把.新项目使用Vue-cli3.0 + TypeScript3.0开发(因为Vue-cli2.0与ts的集成体验并不好,所以就不考虑了),其实V

Typescript : 遍历Array的方法:for, forEach, every等

方法一,for-of 这个貌似是最常用的方法,angular 2中HTML语法绑定也是要的这种语法. let someArray = [1, "string", false]; for (let entry of someArray) { console.log(entry); // 1, "string", false } for-in 官方文档上强调了for-in和for-of的区别: let list = [4, 5, 6]; for (let i in li

[TypeScript] Create random integers in a given range

Learn how to create random integers using JavaScript / TypeScript. /** * Returns a random int between * @param start inclusive * @param before exclusive */ export function randomInt(start: number, before: number) { return start + Math.floor(Math.rand