透过 Props 可以让子元件接收来自父元件的「资料」,相对地,父元件则可以接收来自子元件的「事件」,双方互相传递内容,最终可让子元件变成单纯处理画面样式的 pure component,而父元件则掌握所有控制权,再次以集中管理的方式让复杂程序的执行局限在父元件身上,同时也能加速除错时不用反覆查找资料出错的位置。
那麽就来尝试应用在解决新需求上,首先需要在页面内新增一个搜寻栏,不同於 Navbar 针对全站的关键字查询功能(预先假设),该搜寻栏位只会针对页面资料范围内的书本名称进行比对。
vm.$emit( eventName, […args] )
:定义需要接收来自子元件的事件先在子元件使用 v-on
监听事件,并定义好事件名称 searchBook
及所需传递的参数 $event
,再将事件 $emit
传给父元件。
<div class="BookList">
<h1>{{ navTitle }}</h1>
<p>共计 {{ bookList.length }} 本书</p>
<label>搜寻书本:
<input
type="text"
:value="inputText"
@input="$emit('searchBook', $event)" />
</label>
<div class="bookshelf">
<!-- 略 -->
</div>
</div>
input 需要显示的 value 值则再次透过 prop
取自於父元件传入的资料。
props: {
inputText: {
type: String,
required: false,
},
},
在父元件监听该事件名称 searchText
,获得即时输入的结果为 $event.target.value
,因为没有需要执行其他动作,因此直接在 <template> 将结果赋值给 inputText
,让其透过 prop
传入子元件中的 input 显示出来。
<BookList
navTitle="All"
:bookList="books"
:inputText="searchText"
@searchBook="searchText = $event.target.value"
/>
接着可透过简单的正规表达式进行比对,从原本的 API 书单资料中筛选出符合搜寻栏位输入值的书本名称,books
阵列资料因此经过变动,而 inputText
则因为动态绑定而能同步更新资料再传入到子元件中。
computed: {
books() {
const regex = new RegExp(this.searchText, "gi");
return this.$store.getters["allBooks"].filter((book) =>
book.name.match(regex)
);
},
},
试着在全部书单页面中搜寻书本名包含「IT邦」的列表,根据输入值即时判断书单结果;循序渐进地先输入「IT」两个字,即时出现书单变化。
最後搜寻「IT邦」显示共有 19 本书。
与 IT邦帮忙的导览项目页面结果相符,正确无误!
<<: [Day 23] 资料旅程 — 好想出去玩 V1.0 ٩(●ᴗ●)۶
>>: Day-24 : 开发时,使用到tailwindCSS,今天来讲安装
首先我们先来看看Flutter 启动流程以及Flutter 和 Native 通信的原理 参考:Fl...
敏捷开发 https://wolkesau.medium.com/敏捷开发-1afc1cd6edf ...
到目前为止所跑的测试都是利用 docker 在本机run scylla & redis 测试...
前言 看群里和laravel社群有些人对docker不太会使用,在这里我推荐使用laradock来部...
传统的架构上, 我们会使用独立机械建置 Git、Jenkins, 最後部署至目标环境, 到目前为止,...