使用VueCli3+TypeScript+Vuex一步步构建todoList的方法

使用VueCli3+TypeScript+Vuex一步步构建todoList

本文将带领大家了解使用VueCli3+TypeScript+Vuex来构建一个简单的todoList。

  1. 初始化项目

首先,在命令行中使用以下命令初始化项目:

vue create todoList

在安装过程中,可以选择Manually select features来手动选择需要安装的特性;也可以在需要的地方添加TypeScript的支持,在后面的过程中,我们将更详细地了解这些细节。

  1. 安装Vuex

安装Vuex的命令如下:

npm install vuex --save
  1. 创建store文件和模块

在src目录下创建一个store文件夹,再创建一个index.ts文件和一个modules文件夹,用于放置各个模块的ts文件。

在index.ts文件中,我们初始化了一个Store,并且引入了modules中的模块。

import Vue from 'vue'
import Vuex, { Store } from 'vuex'
import { state, mutations } from './modules/todo'

Vue.use(Vuex)

const store: Store<any> = new Vuex.Store({
  state,
  mutations
})

export default store

在modules文件夹中,我们创建了一个todo.ts文件,该文件包含了todoList所需要的状态、行为和其它逻辑。以下是示例代码:

import { MutationTree } from 'vuex'
import { TodoState } from '../definitions'

export const state: TodoState = {
  todos: [
    { id: 1, text: 'Learn TypeScript', completed: true },
    { id: 2, text: 'Learn Vue', completed: false }
  ]
}

const mutations: MutationTree<TodoState> = {
  // Add a new todo
  ADD_TODO (state, {text}) {
    state.todos.push({
      id: state.todos.length + 1,
      text,
      completed: false
    })
  },

  // Remove a todo
  REMOVE_TODO (state, {index}) {
    state.todos.splice(index, 1)
  },

  // Toggle todo completed
  TOGGLE_TODO_COMPLETED (state, {index}) {
    state.todos[index].completed = !state.todos[index].completed
  }
}

export default {
  state,
  mutations
}
  1. 创建组件

现在,我们可以开始创建todoList所需要的组件。以下是一个使用Vue单文件组件实现的示例。

<template>
  <div>
    <ul>
      <li v-for="(todo, index) in todos" :key="todo.id">
        <input type="checkbox" v-model="todo.completed" @change="toggleCompleted(todo, index)">
        <span :class="{ completed: todo.completed }">{{ todo.text }}</span>
        <button @click="remove(index)">Remove</button>
      </li>
    </ul>
    <input type="text" v-model="newTodo" @keyup.enter="add">
  </div>
</template>

<script lang="ts">
  import { Component, Vue } from 'vue-property-decorator'
  import { Todo } from '../definitions'

  @Component
  export default class ToDoList extends Vue {
    todos: Todo[] = this.$store.state.todos
    newTodo: string = ''

    add (): void {
      this.$store.commit('ADD_TODO', {text: this.newTodo})
      this.newTodo = ''
    }

    remove (index: number): void {
      this.$store.commit('REMOVE_TODO', {index})
    }

    toggleCompleted (todo: Todo, index: number): void {
      this.$store.commit('TOGGLE_TODO_COMPLETED', {index})
    }
  }
</script>
  1. 集成组件和store

为了正常使用store,我们需要在入口文件main.ts中引入store并挂载到Vue上。代码如下:

import Vue from 'vue'
import store from './store'

import ToDoList from './components/ToDoList.vue'

Vue.config.productionTip = false

new Vue({
  store,
  render: h => h(ToDoList)
}).$mount('#app')
  1. 示例说明

以下是一个关于如何使用VueCli3+TypeScript+Vuex构建与API交互的todoList示例。

首先,我们需要更新项目的dependencies,增加一些API调用所需的库。

npm install axios @types/axios --save

然后,我们需要添加一个新的store模块,用于处理API的调用。以下是示例代码:

import { ActionTree } from 'vuex'
import { Todo, TodoState } from '../definitions'
import axios from 'axios'

const BASE_URL: string = 'http://localhost:3000'

const actions: ActionTree<TodoState, any> = {
  fetchTodos ({ commit }): void {
    axios.get(`${BASE_URL}/api/todos`).then(({ data }) => {
      commit('SET_TODOS', data)
    })
  },

  addTodo ({ commit }, todo: Todo): void {
    axios.post(`${BASE_URL}/api/todos`, todo).then(({ data }) => {
      commit('ADD_TODO', data)
    })
  },

  removeTodo ({ commit }, todo: Todo): void {
    axios.delete(`${BASE_URL}/api/todos/${todo.id}`).then(() => {
      commit('REMOVE_TODO', {id: todo.id})
    })
  },

  toggleCompleted ({ commit }, todo: Todo): void {
    axios.patch(`${BASE_URL}/api/todos/${todo.id}`, todo).then(() => {
      commit('TOGGLE_TODO_COMPLETED', {id: todo.id})
    })
  }
}

export default actions

接着,我们需要更新组件代码以引用API调用。以下是示例代码:

<script lang="ts">
  import { Component, Vue } from 'vue-property-decorator'
  import { Todo } from '../definitions'

  @Component
  export default class ToDoList extends Vue {
    todos: Todo[] = []

    created (): void { this.fetchTodos() }

    async fetchTodos (): Promise<void> {
      await this.$store.dispatch('fetchTodos')
      this.todos = this.$store.state.todos
    }

    add (): void {
      const todo: Todo = { text: this.newTodo, completed: false }
      this.$store.dispatch('addTodo', todo).then(() => {
        this.newTodo = ''
      })
    }

    remove (todo: Todo): void {
      this.$store.dispatch('removeTodo', todo)
    }

    toggleCompleted (todo: Todo): void {
      this.$store.dispatch('toggleCompleted', todo)
    }
  }
</script>

这些代码将使用API实现了get、post、delete和patch方法,从而和后端建立了交互,并使用vuex的action处理异步调用。

  1. 总结

以上就是使用VueCli3+TypeScript+Vuex构建todoList的攻略,通过无缝集成API调用的示例,你应该可以更加深入地了解Vue+TypeScript+Vuex的开发实践。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用VueCli3+TypeScript+Vuex一步步构建todoList的方法 - Python技术站

(0)
上一篇 3天前
下一篇 3天前

相关文章

  • windows实现npm和cnpm安装步骤

    下面是详细讲解 “Windows 实现 npm 和 cnpm 安装步骤” 的完整攻略。 1. 下载并安装 Node.js 首先需要下载并安装 Node.js。进入 Node.js 官网,选择适合自己操作系统的版本,然后下载并安装。 2. 检查 Node.js 和 npm 是否安装成功 在命令行窗口中输入以下命令: node -v 如果输出 Node.js 的…

    Vue 1天前
    00
  • Vue-CLI 3.X 部署项目至生产服务器的方法

    下面是关于如何使用Vue-CLI 3.X 部署项目至生产服务器的完整攻略: 1. 生成生产环境代码 在部署之前,我们需要先生成生产环境代码。在命令行终端中,进入项目的根目录,然后输入以下命令即可: npm run build 这会将项目打包为生产环境的代码,并将最终生成的代码存储在dist目录中。 2. 部署到生产服务器 有多种方式可以将Vue.js项目部署…

    Vue 1天前
    00
  • 解决vue的 v-for 循环中图片加载路径问题

    下面为您详细讲解如何解决Vue的v-for循环中图片加载路径问题。 问题描述 在Vue的v-for循环中使用img标签加载图片时,往往会遇到图片路径加载问题。这是由于Vue的模板编译器会根据v-bind指令绑定的路径将图片路径转换为一个表达式,因此有可能导致图片无法正确加载。 解决方案 解决Vue的v-for循环中图片加载路径问题的方法有很多,下面我将为您介…

    Vue 2天前
    00
  • vue如何使用moment处理时间戳转换成日期或时间格式

    下面是关于使用moment处理时间戳转换成日期或时间格式的完整攻略。 什么是moment.js? moment.js 是一个javascript 日期库,可用于解析、验证、操作和格式化日期。它支持日期和时间的计算、时间戳、日期字符串解析和格式化,以及各种本地化和时区设置等功能。 在Vue中使用moment.js 使用moment.js需要先将其引入到Vue项…

    Vue 1天前
    00
  • vue 事件获取当前组件的属性方式

    获取当前组件的属性是Vue中常见的操作之一。下面是Vue中获取当前组件属性的完整攻略。 方式一:$event对象 可以通过$event对象来获取当前组件属性。$event是事件回调函数的第一个参数,它是原生DOM事件对象的包装。我们可以从这个对象中获取各种属性。 例如,我们有一个input组件: <input type="text"…

    Vue 1天前
    00
  • Vue3 入口文件createApp函数详解

    下面就是关于「Vue3 入口文件createApp函数详解」的完整攻略。 什么是createApp函数? createApp 函数是 Vue 3 的入口函数,用于创建一个应用程序实例。在使用 Vue 3 开发应用程序时,通常是以 createApp 函数为入口。 createApp函数的语法 createApp 函数的语法如下: const app = cr…

    Vue 1天前
    00
  • vue数据对象length属性未定义问题

    当使用Vue框架进行开发时,我们有时候会遇到Vue数据对象的length属性未定义的问题。当访问一个数组类型的数据对象的length属性时,比如myArray.length,控制台会报出“Cannot read property ‘length’ of undefined”错误。 这通常是因为在访问Vue数据对象的length属性之前,数据对象还未初始化,数…

    Vue 1天前
    00
  • vue router-link传参以及参数的使用实例

    下面我将为您详细讲解“Vue Router-Link 传参以及参数的使用”。 什么是 Vue Router-Link? Vue Router-Link 是 Vue.js 的一个路由组件,可以让你在 SPA(Single Page Application 单页应用程序)中实现页面跳转和参数传递。 如何使用 Vue Router-Link 传参? 使用 Vue …

    Vue 1天前
    00
  • Vue中的v-cloak使用解读

    当使用Vue.js进行开发时,可能会出现一种情况:在 Vue.js 的编译过程中,由于使用了某些具有 v- 前缀的指令,例如v-if、v-for等,在渲染 HTML 界面的时候,页面会显示出这些指令,而此时还没有完成Vue实例的挂载。 为了解决这个问题,Vue.js提供了一种指令:v-cloak。该指令在 Vue.js 实例挂载之前会一直存在于对应的 HTM…

    Vue 2天前
    00
  • vue中的proxyTable反向代理(亲测有用)

    下面我将为你详细讲解“vue中的proxyTable反向代理(亲测有用)”的攻略。 什么是proxyTable? proxyTable是vue-cli中用于开发环境的devServer选项的一个配置,可以进行反向代理,实现跨域请求的功能。它可以将本地请求转发到后端API接口进行处理,避免跨域问题和处理复杂的跨域请求头。 proxyTable的配置方式 在vu…

    Vue 2天前
    00