基于Vue组件实现TodoList,2024华为Web前端面试真题解

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Web前端全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024c (备注前端)
img

正文

💗 功能二: 在输入框中输入内容后按enter键,即可把内容添加到下面的列表中(如果内容为空则不添加)


在UserHeader.vue组件里面为表单绑定一个回车事件,配置一个add事件,添加一个任务

<input

type=“text”

placeholder=“请输入你的任务名称,按回车键确认”

@keyup.enter=“add”

v-model=“title”

/>

如何通知App组件去添加一个todo对象 也就是将包装好的todoObj对象传递给App组件?

利用props配置可以实现父组件给子组件传值的操作,此功能需求得实现子组件传值给父组件的操作

因为添加任务的是由UserHeader组件添加数据到UserList组件,而两者的关系是兄弟关系,只有借助它们共同的父组件进行间接传值的操作

思路:父组件提前给子组件传递一个函数,子组件将需要传递给父组件的值通过参数的形式传递

App组件提前给子组件传递一个函数addtodo

methods: {

//添加一个todoObj
addtodo(todoObj) {
  //往data里面添加数据,data数据改变了,重新解析模版
  this.todos.unshift(todoObj);
},

UserHeader子组件:

随机生成一个唯一的id

安装:  npm i nanoid

导入:import {nanoid} from ‘nanoid’

使用:id: nanoid()

props: [“addtodo”],

methods: {

add() {
  //校验数据
  if (!this.title.trim()) {
    alert("数据不能为空");
  }
  //添加一个信息 也可以直接用e.target.value拿到这个输入的值
  // 将用户的输入包装成一个todoObj对象
  const todoObj = { id: nanoid(), title: this.title, done: false };
  //通知App组件去添加一个todo对象 也就是将包装好的todoObj对象传递给App组件
  this.addtodo(todoObj);
  //清空输入
  this.title = " ";
},

},

💗 功能三: 动态计算有几个已完成的任务以及所有的任务


此时需要在UserFooter组件中通过计算属性计算得出已完成的任务

computed: {

doneTotal() {

return this.todos.reduce((pre, todo) => pre + (todo.done ? 1 : 0), 0);

},

},

arry.reduce()方法:

reduce() 方法对数组中的每个元素执行一个由您提供的reducer函数(升序执行),将其结果汇总为单个返回值。

返回值分配给累计器,该返回值在数组的每个迭代中被记住,并最后成为最终的单个结果值


第一个参数:累计器累计回调的返回值; 它是上一次调用回调时返回的累积值

第二个参数:数组中正在处理的元素。

计算所有的任务

方法一:最简单的方法

todos.length

第二种:计算得出

total() {

return this.todos.length;

},

💗 功能四、点击复选框,实现选中或不选中效果(即完成或未完成)双向绑定


借助UserList 组件实现UserItem和App组件之间互相传值

UserItem组件:

UserFooter组件:

isAll: {

get() {

//返回的是布尔值

return this.doneTotal === this.total && this.total > 0;

},

set(value) {

this.checkAlltodo(value);

},

},

App 组件:

methods: {

//勾选或者取消勾选一个todo

checktodo(id) {

this.todos.forEach((todo) => {

if (todo.id === id) {

todo.done = !todo.done;

}

});

},

//全选或不全选todoObj

checkAlltodo(done) {

this.todos.forEach((todo) => {

todo.done = done;

});

},

},

💗 功能五、删除单个任务以及删除已完成任务


App.vue 组件

<UserList

:todos=“todos”

:checktodo=“checktodo”

:deletetodo=“deletetodo”

/>

<UserFooter

:todos=“todos”

:checkAlltodo=“checkAlltodo”

:clearAlltodo=“clearAlltodo”

/>

结尾

学习html5、css、javascript这些基础知识,学习的渠道很多,就不多说了,例如,一些其他的优秀博客。但是本人觉得看书也很必要,可以节省很多时间,常见的javascript的书,例如:javascript的高级程序设计,是每位前端工程师必不可少的一本书,边看边用,了解js的一些基本知识,基本上很全面了,如果有时间可以读一些,js性能相关的书籍,以及设计者模式,在实践中都会用的到。

html5

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
计,是每位前端工程师必不可少的一本书,边看边用,了解js的一些基本知识,基本上很全面了,如果有时间可以读一些,js性能相关的书籍,以及设计者模式,在实践中都会用的到。

html5

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)
[外链图片转存中…(img-v30vzWkh-1713545291355)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 19
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 创建搜索框组件 首先,我们需要创建一个搜索框组件,可以使用Element UI中的Input组件实现,同时为了实现搜索框的动态特效,我们需要使用Vue的watch属性来监听搜索框的value值的变化。 ```html <template> <el-input v-model="value" placeholder="请输入搜索内容" @keyup.enter="handleSearch"></el-input> </template> <script> export default { data() { return { value: '' } }, watch: { value(val) { this.$emit('search', val) } }, methods: { handleSearch() { this.$emit('search', this.value) } } } </script> ``` 在上面的代码中,我们使用了Element UI中的Input组件,同时定义了value属性来存储搜索框的值。并且使用了watch属性来监听value值的变化,并且在value值发生变化时,触发search事件向父组件发送搜索请求。同时,在搜索框的enter键被按下时,也会触发handleSearch方法,向父组件发送搜索请求。 2. 创建搜索结果组件 接下来,我们需要创建一个搜索结果组件,用于展示搜索结果。在此,我们将使用Element UI中的Table组件实现搜索结果的展示,同时也需要使用Vue的props属性来接收父组件传递过来的搜索结果数据。 ```html <template> <el-table :data="searchResult"> <el-table-column label="ID" prop="id"></el-table-column> <el-table-column label="名称" prop="name"></el-table-column> <el-table-column label="价格" prop="price"></el-table-column> </el-table> </template> <script> export default { props: { searchResult: { type: Array, default: () => [] } } } </script> ``` 在上面的代码中,我们使用了Element UI中的Table组件,并且使用了props属性来接收父组件传递过来的searchResult数据(即搜索结果数据)。同时,我们也定义了搜索结果的列名和列属性,以及使用了默认值来避免在没有搜索结果时出现错误。 3. 实现组件 最后,我们需要在父组件中将搜索框和搜索结果组件组合起来,并且实现搜索功能。在此,我们可以使用Vue的computed属性来实现搜索功能,同时也需要使用Vue的methods属性来处理搜索请求,最终将搜索结果数据传递给搜索结果组件。 ```html <template> <div> <search-box @search="handleSearch"></search-box> <search-result :search-result="searchResult"></search-result> </div> </template> <script> import SearchBox from './SearchBox' import SearchResult from './SearchResult' export default { components: { SearchBox, SearchResult }, data() { return { data: [ { id: 1, name: 'iPhone 12', price: 5999 }, { id: 2, name: '华为Mate 40', price: 4999 }, { id: 3, name: '三星Galaxy S21', price: 5399 }, { id: 4, name: '小米11', price: 3999 }, { id: 5, name: 'OPPO Reno4 Pro', price: 3799 } ], searchResult: [] } }, computed: { filteredData() { const keyword = this.keyword.trim().toLowerCase() if (keyword === '') { return [] } else { return this.data.filter(item => item.name.toLowerCase().indexOf(keyword) !== -1) } } }, methods: { handleSearch(keyword) { this.keyword = keyword this.searchResult = this.filteredData } } } </script> ``` 在上面的代码中,我们首先引入了搜索框和搜索结果组件,并且定义了data数据来存储所有商品数据。同时,我们也定义了searchResult数据来存储搜索结果数据。在computed属性中,我们使用了filteredData方法来根据关键词搜索匹配的商品数据,如果关键词为空,则返回空数组。在methods属性中,我们定义了handleSearch方法来处理搜索请求,并且将搜索结果数据赋值给searchResult数据。 最后,我们将搜索框和搜索结果组件组合起来,并且将searchResult数据传递给搜索结果组件实现了动态搜索引擎的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值