Todos - Vite 项目案例

TrystanLei2022年10月5日约 602 字大约 2 分钟...

初始化项目

npm init vite-app todos
npm install
npm i less -D

梳理项目结构

  1. 重置 index.css 中的全局样式:
:root {
  font-size: 12px;
}

body {
  padding: 8px;
}
  1. 重置 App.vue 组件的代码结构为:
<template>
  <div>
    <h1>Hello, world</h1>
  </div>
</template>

<script>
export default {
  name: "TodoApp",
  data() {
    return {
      todolist: [
        { id: 1, text: "Learn Vue", done: true },
        { id: 2, text: "Learn Vue Router", done: false },
        { id: 3, text: "Learn Vuex", done: false },
      ],
    };
  },
};
</script>
<style lang="less" scoped></style>
  1. 删除 compenents 目录下的 HelloWorld.vue 组件。
  2. 在终端运行:
npm run dev

封装 todo-list 组件

创建并注册组件

  1. 创建 src/components/todo-list/TodoList.vue 文件。
  2. 在 App.vue 中注册该文件。
<template>
  <div>
    <TodoListVue></TodoListVue>
  </div>
</template>

<script>
import TodoListVue from "./components/todo-list/TodoList.vue";
export default {
  name: "TodoApp",
  components: {
    TodoListVue,
  },
  data() {
    return {
      todolist: [
        { id: 1, text: "Learn Vue", done: true },
        { id: 2, text: "Learn Vue Router", done: false },
        { id: 3, text: "Learn Vuex", done: false },
      ],
    };
  },
};
</script>
<style lang="less" scoped></style>

基于 bootstrap 渲染组件

  1. 安装 bootstrap
npm i bootstrap@4.6.1
  1. main.js 中导入 bootstrap 样式表:
import { createApp } from "vue";
import App from "./App.vue";

import "bootstrap/dist/css/bootstrap.min.css"; // 这里没导入 .js
import "./index.css";

createApp(App).mount("#app");
  1. 根据 bootstrap 提供的列表组与复选框渲染列表组件基本效果
<template>
  <div>
    <ul class="list-group">
      <!-- 列表组 -->
      <li class="list-group-item d-flex justify-content-between align-items-center">
        <!-- 复选框 -->
        <div class="form-check">
          <input class="form-check-input" type="checkbox" value="" id="defaultCheck1" />
          <label class="form-check-label" for="defaultCheck1"> Default checkbox </label>
        </div>
        <!-- 徽标 -->
        <span class="badge badge-success badge-pill">完成</span>
        <span class="badge badge-warning badge-pill">未完成</span>
      </li>
    </ul>
  </div>
</template>
<script>
export default {
  name: "TodoList",
};
</script>
<style lang="less" scoped></style>

为 TodoList 声明 props 属性

  1. todolist.vue 中声明 props 属性
export default {
  name: "TodoList",
  props: {
    list: {
      type: Array,
      required: true,
      default: [],
    },
  },
};
  1. App.vue 中通过 list 属性,将数据传递给 TodoList 组件之中:
<TodoList :list="todolist"></TodoList>

渲染列表的 DOM 结构

todolist.vue 中使用 vue 指令进行渲染列表

<template>
  <div>
    <ul class="list-group">
      <!-- 列表组 -->
      <li v-for="item in list" key="item.id" class="list-group-item d-flex justify-content-between align-items-center">
        <!-- 复选框 -->
        <div class="form-check">
          <input class="form-check-input" type="checkbox" v-model="item.done":id="'defaultCheck' + item.id" />
          <label class="form-check-label" :for="'defaultCheck' + item.id"> {{ item.text }} </label>
        </div>
        <!-- 徽标 -->
        <span v-if="item.done" class="badge badge-success badge-pill">完成</span>
        <span v-else class="badge badge-warning badge-pill">未完成</span>
      </li>
    </ul>
  </div>
</template>

注意

坑:v-for 对应的是 key 属性,而不是 v-key!!!!!报错信息根本看不出来。。

评论
Powered by Waline v2.6.3