2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ChatGPTでvueを使いToDoリストを作成する

Posted at

ChatGPTを使用してVue 3、Vue Router、Vuexを使用したToDoリストアプリを作りました

やりたいこと

vue3
Vue Router
Vuex
でtodoリストを作る

chatGPTに質問

vue3でtodoリストを作りたいです
routerとvuexを入れています
ほしい機能は
・todoの登録
・todoの完了
・todoの削除
・todoの編集です

返ってきた答え

Vuexストアをセットアップします。store/index.jsファイルを作成し、以下のようにコードを追加します。

import { createStore } from 'vuex';

export default createStore({
  state: {
    todos: [],
  },
  mutations: {
    addTodo(state, todo) {
      state.todos.push(todo);
    },
    completeTodo(state, id) {
      const todo = state.todos.find(todo => todo.id === id);
      if (todo) {
        todo.completed = !todo.completed;
      }
    },
    deleteTodo(state, id) {
      state.todos = state.todos.filter(todo => todo.id !== id);
    },
    editTodo(state, payload) {
      const todo = state.todos.find(todo => todo.id === payload.id);
      if (todo) {
        todo.text = payload.text;
      }
    },
  },
  actions: {
    addTodo({ commit }, todo) {
      commit('addTodo', todo);
    },
    completeTodo({ commit }, id) {
      commit('completeTodo', id);
    },
    deleteTodo({ commit }, id) {
      commit('deleteTodo', id);
    },
    editTodo({ commit }, payload) {
      commit('editTodo', payload);
    },
  },
  getters: {
    getTodos: state => state.todos,
  },
});

Vue Routerをセットアップします。router/index.jsファイルを作成し、以下のようにコードを追加します。
// router/index.js

import { createRouter, createWebHistory } from 'vue-router';
import TodoList from '../views/TodoList.vue';

const routes = [
  {
    path: '/',
    name: 'TodoList',
    component: TodoList,
  },
];

const router = createRouter({
  history: createWebHistory(),
  routes,
});

export default router;

ToDoリストのコンポーネントを作成します。views/TodoList.vueファイルを作成し、以下のようにコードを追加します。

<template>
  <div>
    <h1>ToDoリスト</h1>
    <input v-model="newTodo" @keyup.enter="addTodo" placeholder="新しいToDoを追加">
    <ul>
      <li v-for="todo in todos" :key="todo.id">
        <span :class="{ completed: todo.completed }">{{ todo.text }}</span>
        <button @click="toggleComplete(todo.id)">{{ todo.completed ? '未完了' : '完了' }}</button>
        <button @click="edit(todo.id)">編集</button>
        <button @click="remove(todo.id)">削除</button>
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      newTodo: '',
    };
  },
  computed: {
    todos() {
      return this.$store.getters.getTodos;
    },
  },
  methods: {
    addTodo() {
      if (this.newTodo.trim() === '') return;
      this.$store.dispatch('addTodo', { id: Date.now(), text: this.newTodo, completed: false });
      this.newTodo = '';
    },
    toggleComplete(id) {
      this.$store.dispatch('completeTodo', id);
    },
    edit(id) {
      const text = prompt('ToDoを編集', this.todos.find(todo => todo.id === id).text);
      if (text !== null) {
        this.$store.dispatch('editTodo', { id, text });
      }
    },
    remove(id) {
      if (confirm('ToDoを削除しますか?')) {
        this.$store.dispatch('deleteTodo', id);
      }
    },
  },
};
</script>

<style>
.completed {
  text-decoration: line-through;
}
</style>

これで、Vue 3でToDoリストアプリケーションがセットアップされ、以下の機能が実装されています。

ToDoの登録
ToDoの完了/未完了の切り替え
ToDoの削除
ToDoの編集
このコードをベースにして、さらにカスタマイズや追加の機能を実装できます。

と帰ってきました

1発でちゃんとうごきました
image.png

次にcssも書いてもらいます

css

テキストボックスをおしゃれにしてください

と質問しました
返ってきたのが↓

<style>
/* ... 既存のスタイル ... */

/* テキストボックスのスタイル */
input[type="text"] {
  width: 100%;
  padding: 10px;
  font-size: 16px;
  margin-bottom: 10px;
  border: none;
  background-color: #f9f9f9;
  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
  transition: border-color 0.3s, box-shadow 0.3s;
}

/* テキストボックスのフォーカス時のスタイル */
input[type="text"]:focus {
  border-color: #007bff;
  box-shadow: 0 2px 6px rgba(0, 123, 255, 0.5);
  outline: none;
}

/* ... 既存のスタイル ... */
</style>

cssではinput[type="text"]を言われていますが実際のHTMLを見ると

<input v-model="newTodo" @keyup.enter="addTodo" placeholder="新しいToDoを追加" class="custom-input">

です
type="text"ではないので

そのcssは
<input v-model="newTodo" @keyup.enter="addTodo" placeholder="新しいToDoを追加">
にききますか

のように返しました

すると
クラスを付けたコードで帰ってきました

<input v-model="newTodo" @keyup.enter="addTodo" placeholder="新しいToDoを追加" class="custom-input">

cssも同じようにクラス名に代わって完成です!

完了、編集、削除もできてます!
image.png

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?