1. 案例效果
2. 用到的知识点
① vite 创建项目
② 组件的封装与注册
③ props
④ 样式绑定
⑤ 计算属性
⑥ 自定义事件
⑦ 组件上的 v-model
3. 整体实现步骤
① 使用 vite 初始化项目
② 梳理项目结构
③ 封装 todo-list 组件
④ 封装 todo-input 组件
⑤ 封装 todo-button 组件
4. 初始化项目
1.在终端运行以下的命令,初始化 vite 项目:
npm init vite-app todos
2.使用 vscode 打开项目,并安装依赖项:
npm i
3.安装 less 语法相关的依赖项:
npm i less -D
5. 梳理项目结构
1.重置 index.css 中的全局样式如下:
:root { font-size: 12px; } body { padding: 8px; }
2.重置 App.vue 组件的代码结构如下:
<template> <div> <h1>App 组件</h1> </div> </template> <script> export default { name: 'App', data() { return { // 任务列表的数据 todolist: [ { id: 1, task: '周一早晨9点开会', done: false }, { id: 2, task: '周一晚上8点聚餐', done: false }, { id: 3, task: '准备周三上午的演讲稿', done: true }, ] } } } </script> <style lang="less" scoped> </style>
3.删除 components 目录下的 HelloWorld.vue 组件。
4.在终端运行以下的命令,把项目运行起来:
npm run dev
6. 封装 todo-list 组件
6.1 创建并注册 TodoList 组件
1.在 src/components/todo-list/ 目录下新建 TodoList.vue 组件:
<template> <dir> <h3>todolist 组件</h3> </dir> </template> <script> export default { name: 'TodoList' } </script> <style lang="less" scoped> </style>
2.在 App.vue 组件中导入并注册 TodoList.vue 组件:
3.在 App.vue 的 template 模板结构中使用注册的 TodoList 组件:
<template> <div> <h1>App 组件</h1> <hr> <!-- 使用TodoList组件 --> <todo-list></todo-list> </div> </template> <script> import TodoList from './components/todo-list/TodoList.vue' export default { name: 'App', data() { return { // 任务列表的数据 todolist: [ { id: 1, task: '周一早晨9点开会', done: false }, { id: 2, task: '周一晚上8点聚餐', done: false }, { id: 3, task: '准备周三上午的演讲稿', done: true }, ] } }, components: { TodoList } } </script> <style lang="less" scoped> </style>
6.2 基于 bootstrap 渲染列表组件
1.下载 bootstrap.css 拷贝到 src/assets/ 静态资源目录中。
bootstap.css
2.在 main.js 入口文件中,导入 src/assets/css/bootstrap.css 样式表:
import { createApp } from 'vue' import App from './App.vue' // 导入 bootstrap.css 样式表 // npm 安装 bootstrap 但是有样式不能显示 // import '../node_modules/bootstrap/dist/css/bootstrap.css' import './assets/bootstrap.css' import './index.css' createApp(App).mount('#app')
3.根据 bootstrap 提供的列表组(https://v4.bootcss.com/docs/components/list-group/#with
-badges)和复选框( https://v4.bootcss.com/docs/components/forms/#checkboxes-and-radios-1 )渲染列表组件的基本效果:
<template> <div> <ul class="list-group"> <!-- 列表组 --> <li class="list-group-item d-flex justify-content-between align-items-center"> <!-- 复选框 --> <div class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="customCheck1"> <label class="custom-control-label" for="customCheck1">Check this custom 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>
6.3 为 TodoList 声明 props 属性
1.为了接受外界传递过来的列表数据,需要在 TodoList 组件中声明如下的 props 属性:
<script> export default { name: 'TodoList', props: { // 列表数据 list: { type: Array, required: true, default: [] } } } </script>
2.在 App 组件中通过 list 属性,将数据传递到 TodoList 组件之中:
<template> <div> <h1>App 组件</h1> <hr> <!-- 使用TodoList组件 --> <todo-list :list="todolist"></todo-list> </div> </template>