vue3+TS+vueX的记录

要求:在页面中使用输入框输入回车后将数据保存到vuex中的数组list中

list为一个数组 内部三个属性为 id  value  status

id为时间戳

value为string 输入的字符串

status为定义的三种状态 待办  在办 完成

 1、创建仓库  将 仓库拆分

import { createStore } from 'vuex'
import state from './state'
import actions from './actions'
import mutations from './mutations'
export default createStore({
  state,
  mutations,
  actions
})

使用action调用mutation中的方法修改state的list

2、定义数据类型

全局定义SET_TODO

export const SET_TODO:string='SET_TODO'

state的总体类型 后续有什么字段就添加什么类型
interface IState{
  list:ITodo[]
}
添加的对象类型
interface ITodo {
  id:number,
  content:string,
  status:TODO_STATUS
}
枚举类型
enum TODO_STATUS{
  WILLDO='willdo',
  DOING='doing',
  FINISHEN='finshing'

}
export {
  ITodo,
  IState,
  TODO_STATUS

}

3、调用

 定义数据的增删改查所有方法合集

举例  调用setTodo方法  将输入框的value传值写入todo数据中

调用SET_TODO 方法

import { SET_TODO } from "@/store/actionsTypes";
import { ITodo, TODO_STATUS } from "@/typings";
import { useStore } from "vuex";


interface IUseTodo{
    setTodo:(value:string)=>void;
    setTodoList:()=>void;
    removeTodo:()=>void;
    setStatus:()=>void;
    setDoing:()=>void;
}
function useTodo() :IUseTodo{
const store=useStore()
  function setTodo(value:string):void {
      const todo:ITodo={
        id:new Date().getTime()
        ,content:value,
        status:TODO_STATUS.WILLDO
      }
     store.dispatch(SET_TODO, todo)
  }
  function setTodoList() {

  }
  function removeTodo() {

  }
  function setStatus() {

  }
  function setDoing() {

  }
  return {
    setTodo,
    setTodoList,
    removeTodo,
    setStatus,
    setDoing,
  };
}
export  {useTodo};

 获取到需要添加上的数据调用mutation方法

import { ITodo, IState } from "@/typings";
import { SET_TODO } from "./actionsTypes";
import { Commit } from "vuex";

interface ICtx {
  commit: Commit;
  state: IState;
}
export default {
   action 去调用mutation的方法
   这定义了stetodo的字符串 等同于 settodo(){}
   action 有两个传入值  ctx 也就是{commit  state}  还有传入值 ITodo 定义过了id之类的相关值

  [SET_TODO]({ commit, state }: ICtx, todo: ITodo): void {
    调用mutation内的方法
    commit(SET_TODO, todo);
  },
};

 将类型为ITodo数据添加到state中的list最后一位

import { IState, ITodo } from "@/typings";

export default{
  // 使用【SET_TODO】是一样的  因为定义的是字符串的SET_TODO
  SET_TODO(state:IState,todo:ITodo):void{
      state.list.unshift(todo)
      console.log(state.list);
      
  }
}

调用  输入框输入 点击回车后调用hooks中的setTodo方法

setTodo是hooks中结构出来的

const getValue=(e:KeyboardEvent)=>{
  if (e.keyCode==13&&inputValue.value.length>0) {
    setTodo(inputValue.value)
    inputValue.value=''
  }
}

### 实现基于Vue 3 和 TypeScript 的聊天功能 为了创建一个完整的聊天应用程序,可以采用组合式API风格来构建组件逻辑[^1]。下面是一个简化版的聊天应用实现方式: #### 创建消息模型接口 定义消息的数据结构对于保持代码的一致性和可读性非常重要。 ```typescript // Message.ts export interface IMessage { id: number; content: string; senderId: number; timestamp?: Date; } ``` #### 设置Vuex Store管理状态 利用 Vuex 来集中管理和共享全局的状态数据是非常有效的做法之一,在这里用来保存所有的聊天记录以及当前用户的ID。 ```typescript import { createStore } from &#39;vuex&#39;; import { IMessage } from &#39;./Message&#39;; const store = createStore({ state() { return { messages: [] as Array<IMessage>, userId: 1, // 假设这是登录用户的 ID }; }, mutations: { addMessage(state, message: IMessage) { state.messages.push(message); } }, actions: {}, }); export default store; ``` #### 构建 Chat 组件 通过 `setup` 函数引入响应式的属性和方法,并且监听输入框的变化事件以便发送新消息。 ```html <template> <div class="chat-container"> <!-- 显示所有消息 --> <ul v-for="(msg, index) in messages" :key="index"> <li>{{ msg.content }} (from user {{ msg.senderId }})</li> </ul> <!-- 输入区域 --> <input type="text" v-model="newMsgContent"/> <button @click="sendMessage">Send</button> </div> </template> <script lang="ts"> import { defineComponent, ref, computed } from &#39;vue&#39;; import { useStore } from &#39;vuex&#39;; import { IMessage } from &#39;../types/Message&#39;; export default defineComponent({ name: &#39;Chat&#39;, setup() { const newMsgContent = ref(&#39;&#39;); const store = useStore(); const messages = computed(() => store.state.messages); function sendMessage(): void { if (!newMsgContent.value.trim()) return; let newMessage: IMessage = { id: Math.floor(Math.random()*999), content: newMsgContent.value, senderId: store.state.userId, timestamp: new Date(), }; store.commit(&#39;addMessage&#39;, newMessage); newMsgContent.value = &#39;&#39;; } return { newMsgContent, messages, sendMessage, }; }, }); </script> ``` 此示例展示了如何使用 Vue 3 及其 Composition API 结合 TypeScript 开发简单的聊天界面并处理基本的消息传递逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值