Day 23:儿子有事交给爸-$emit 传出事件

透过 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」两个字,即时出现书单变化。
search IT

最後搜寻「IT邦」显示共有 19 本书。
search IThelp

与 IT邦帮忙的导览项目页面结果相符,正确无误!
IThelp page

参考资料


<<:  [Day 23] 资料旅程 — 好想出去玩 V1.0 ٩(●ᴗ●)۶

>>:  Day-24 : 开发时,使用到tailwindCSS,今天来讲安装

Day06 Flutter 启动流程

首先我们先来看看Flutter 启动流程以及Flutter 和 Native 通信的原理 参考:Fl...

敏捷开发 组别

敏捷开发 https://wolkesau.medium.com/敏捷开发-1afc1cd6edf ...

day 17 - 利用 interface 来mock外部回应

到目前为止所跑的测试都是利用 docker 在本机run scylla & redis 测试...

〖按图施工保证完工〗Linux CentOS 7 建置 Laradock

前言 看群里和laravel社群有些人对docker不太会使用,在这里我推荐使用laradock来部...

EP12 - 重构并模组化 Terraform 程序码

传统的架构上, 我们会使用独立机械建置 Git、Jenkins, 最後部署至目标环境, 到目前为止,...