vue学习笔记 十九、实例完整代码
|
系列导航 |
||
|---|---|---|
基础知识讲了不少,今天把之前所学的所有内容整合起来实现一个例子完善 vue学习笔记 九、父子组件实例-基本结构中的功能,仔细看代码会有不小的收获。
一、 效果

父组件:Home 由三个子组件组成分别是:navHeader、navMain、navFooter
要完成的功能说明:
navHeader组件:输入新的任务,点击回车如果新的任务navMain中没有则添加到navMain中。
navMain组件:展示任务,点击“删除按钮”则删除当前任务,多选框可以多选任务。
navFooter组件:记录任务完成的数量(多选框选中为完成)、总数,以及点击“清除已完成”按钮删除navHeader中的已完成任务。
二、 项目结构截图

三、代码:
router--index.js
import { createRouter, createWebHistory,createWebHashHistory } from 'vue-router'
import Home from '../views/Home.vue'
//路由的配置属组
//paht:路由路劲 必须以/开头 必填
//component:对应的路由组件 必填
//name:路由的名字
const routes = [
{
path: '/',
name: 'Home',
//按需引入
//如果没有访问/about 就不会加载这个组件 节约性能
component: () => import( '../views/Home.vue')
},
{
path: '/about',
name: 'About',
//按需引入
//如果没有访问/about 就不会加载这个组件 节约性能
component: () => import( '../views/About.vue')
}
]
//创建路由对象
const router = createRouter({
//createWebHashHistory hash模式路径前面会多一个#号
history: createWebHistory(process.env.BASE_URL),
routes
})
export default router
store--index.js
import { createStore } from 'vuex'
export default createStore({
//定义所需要的状态
state: {
list:[
{
title:'吃饭',
complete:false
},{
title:'睡觉',
complete:false
},{
title:'敲代码',
complete:true
},
]
},
//同步修改state 都是方法
//第一个参数state,第二个参数是需要修改的值
mutations: {
//添加任务
addTodo(state,payload){
state.list.push(payload)
},
//删除任务 splice(下标,个数)
delTodo(state,payload){
state.list.splice(payload,1)
},
//清除已完成
clear(state,payload){
state.list = payload
}
},
//异步提交mutations
//第一个参数是store 第二个参数是修改的值
actions: {
},
//模块化的
modules: {
}
})
Home.vue
<template>
<div class="item">
<nav-header @add ='add'></nav-header>
<nav-main :list='list' @del='del'></nav-main>
<nav-footer :list='list' @clear='clear'></nav-footer>
</div> </template> <script>
//编写js内容
import NavHeader from '@/components/navHeader/NavHeader.vue'
import NavMain from '@/components/navMain/NavMain.vue'
import NavFooter from '@/components/navFooter/NavFooter.vue'
import {defineComponent,ref,computed} from 'vue'
import{useStore} from 'vuex' export default defineComponent({
name:'Home',
components:{
NavHeader,
NavMain,
NavFooter
},
setup(){
let store = useStore()
let list = computed(()=>{
return store.state.list
})
let value = ref('')
let add =(val)=>{
value.value = val
//设置flag 判断输入的信息是否已经存在
let flag = true
list.value.map(item =>{
if(item.title===value.value){
//有重复任务
flag = false;
alert('任务已经存在')
} }) if(flag){
//调用mutation
store.commit('addTodo',{
title:value.value,
complete:false
})
} }
//删除任务
let del =(val)=>{
console.log(val)
store.commit('delTodo',val)
}
let clear =(val)=>{
store.commit('clear',val)
}
return {
add,
value,
list,
del,
clear
}
} }) </script> <style scoped lang="scss">
.item{
text-align:left;
}
</style>
NavHeader.vue
<template>
<div >
<input
placeholder="请输入任务名称"
v-model="value"
@keydown.enter="enter"
/>
</div>
</template> <script>
import {defineComponent,ref} from 'vue'
export default defineComponent({
name:'navHeader',
setup(props,ctx){
let value=ref('')
//按回车确认
let enter = () => {
ctx.emit('add',value.value)
//console.log(value.value)
//清空输入框
value.value=''
}
return{
value,
enter
}
}
}) </script> <style scoped lang="scss">
input{
margin-bottom: 10px;
}
</style>
NavMain.vue
<template>
<div v-for="(item,index) in list" :key ="index">
<div class="item">
<input type="checkbox" v-model="item.complete"/>
{{item.title}}
<button class="del" @click="del(item,index)">删除</button>
</div>
</div>
</template> <script>
import {defineComponent,ref} from 'vue'
export default defineComponent({
name:'navMain',
props:{
list:{
type:Array,
required:true
}
},
//放分发事件的属性名字 没有这句浏览器控制台有报错
emits:['del'],
setup(props,ctx){
//删除任务
let del =(item,index)=>{
ctx.emit('del',index)
console.log(item)
console.log(index)
} return{
del
} }
}) </script> <style scoped lang="scss">
.item{
height: 35px;
line-height: 35px;
position: relative;
width: 260px;
cursor: pointer;
button{
position: absolute;
right: 20px;
top: 6px;
display: none;
z-index: 99;
}
&:hover{
background: #ddd;
button{
display: block;
}
} } </style>
NavFooter.vue
<template>
<div >
<div>已完成{{isComplete}} /全部{{list.length}}</div>
<div v-if="isComplete >0" class="btn">
<button @click="clear">清除已完成</button>
</div>
</div>
</template> <script>
import {defineComponent,ref,computed} from 'vue'
export default defineComponent({
name:'navFooter',
props:{
list:{
type:Array,
required:true
}
},
setup(props,ctx){
let isComplete = computed(()=>{
//过滤已完成
let arr = props.list.filter(item =>{
return item.complete
})
return arr.length
}) let clear = ()=>{
//过滤未完成的
let arr = props.list.filter(item =>{
return item.complete ===false
})
ctx.emit('clear',arr)
console.log('clear')
} return{
isComplete,
clear
}
} }) </script> <style scoped lang="scss"> .btn{
margin-left: 10px;
}
</style>
vue学习笔记 十九、实例完整代码的更多相关文章
- python3.4学习笔记(十九) 同一台机器同时安装 python2.7 和 python3.4的解决方法
python3.4学习笔记(十九) 同一台机器同时安装 python2.7 和 python3.4的解决方法 同一台机器同时安装 python2.7 和 python3.4不会冲突.安装在不同目录,然 ...
- JPG学习笔记3(附完整代码)
#topics h2 { background: rgba(43, 102, 149, 1); border-radius: 6px; box-shadow: 0 0 1px rgba(95, 90, ...
- vue学习笔记(十)路由
前言 在上一篇博客vue学习笔记(九)vue-cli中的组件通信内容中,我们学习组件通信的相关内容和进行了一些组件通信的小练习,相信大家已经掌握了vue-cli中的组件通信,而本篇博客将会带你更上一层 ...
- (C/C++学习笔记) 十九. 模板
十九. 模板 ● 模板的基本概念 模板(template) 函数模板:可以用来创建一个通用功能的函数,以支持多种不同形参,进一步简化重载函数的函数体设计. 语法: template <<模 ...
- JPG学习笔记4(附完整代码)
#topics h2 { background: rgba(43, 102, 149, 1); border-radius: 6px; box-shadow: 0 0 1px rgba(95, 90, ...
- JPG学习笔记2(附完整代码)
#topics h2 { background: rgba(43, 102, 149, 1); border-radius: 6px; box-shadow: 0 0 1px rgba(95, 90, ...
- python 学习笔记十九 django深入学习四 cookie,session
缓存 一个动态网站的基本权衡点就是,它是动态的. 每次用户请求一个页面,Web服务器将进行所有涵盖数据库查询到模版渲染到业务逻辑的请求,用来创建浏览者需要的页面.当程序访问量大时,耗时必然会更加明显, ...
- yii2源码学习笔记(十九)
view剩余代码 /** * @return string|boolean the view file currently being rendered. False if no view file ...
- Java基础学习笔记十九 IO
File IO概述 回想之前写过的程序,数据都是在内存中,一旦程序运行结束,这些数据都没有了,等下次再想使用这些数据,可是已经没有了.那怎么办呢?能不能把运算完的数据都保存下来,下次程序启动的时候,再 ...
- Java基础学习笔记十九 File
IO概述 回想之前写过的程序,数据都是在内存中,一旦程序运行结束,这些数据都没有了,等下次再想使用这些数据,可是已经没有了.那怎么办呢?能不能把运算完的数据都保存下来,下次程序启动的时候,再把这些数据 ...
随机推荐
- Gson和fastJson应用场景
如果有性能上面的要求可以使用Gson将bean转换json确保数据的正确,使用FastJson将Json转换Bean 二.Google的Gson包的使用简介. Gson类:解析json的最基础的工 ...
- 虚拟机运行Hadoop | 各种问题解决的心路历程
ps:完成大数据技术实验报告的过程,出项各种稀奇古怪的问题.(知道这叫什么吗?经济基础决定上层建筑,我当时配置可能留下了一堆隐患,总之如果有同样的问题,希望可以帮到你) 一.虚拟机网络连接不通的各种情 ...
- ssm整合-异常处理器
异常处理器 程序开发过程中不可避免会遇到异常现象 类似于这样的异常 异常出现的种类: 各个层均可能出现异常,当我们出现异常时,处理代码应该写在哪一层? 表现层,因为要把异常网上抛,在表现层进行 ...
- 【Linux API 揭秘】container_of函数详解
[Linux API 揭秘]container_of函数详解 Linux Version:6.6 Author:Donge Github:linux-api-insides 1.container_o ...
- 28、错误error
1.是什么? 在实际的项目中,我们希望通过程序的错误信息快速定位问题,但是又不喜欢错误处理:代码就会很冗余又啰嗦.Go语言没有提供类似Java.C#语言中的try...catch异常处理方法,而是通过 ...
- Vue学习笔记-指令
- 假如这个地方可能为null,那他一定会为null
假如你的代码,在某个地方(比如controller层)提示你:这个方法调用可能会产生null,那么千万不要视而不见,在某一瞬间它一定会是null,势必报错. /** * 修改保存管理员 */ @Pos ...
- Golang 命名返回值和普通返回值
1.概述 在Go语言中,函数可以有命名返回值和普通(匿名)返回值.命名返回值会被视为定义在函数顶部的变量,并且在使用 return 语句返回时,不再必须在其后面指定参数名,也就是支持"裸&q ...
- 打造 VSCode 高效 C++ 开发环境的必备插件
工欲善其事,必先利其器 C++ clangd:代码补全.跳转.clang-tidy 检查,自带 clang-format CodeLLDB:LLVM 的调试器(类比 GDB) CMake CMake ...
- 深入了解RC4 Drop加密技术
一.引言 在网络安全领域,加密技术始终是重中之重.随着计算机技术的发展,加密算法也在不断更新换代.RC4(Rivest Cipher 4)加密算法因其高效.简洁的特性,在信息安全领域得到了广泛的应用. ...