vue 将字符串最后一个字符给替换_vue基础手把手教你编写 Vue 组件(下)

3d09dc7a901336ee4bfc789e56342ad3.png

关注前端达人,与你共同进步

edc72ed8d2d220cd8736f46267e28f90.png

大家好,上一篇文章「vue基础」手把手教你编写 Vue 组件(上),我们一起学习了如何编写一个简单的自定义组件,这篇文章我们将继续学习组件其它方面的内容,主要涉及组件的生命周期、属性设置、父子组件传值、槽等相关内容。

组件生命周期

如果你以前使用过React,那么你已经熟悉了组件相关的生命周期的概念。所谓的组件生命周期,就如同人一般从出生到消亡一样,有几个关键的阶段,在这几个关键的阶段,我们可以编写相应的代码进行一些逻辑的处理,比如在初始化组件时,我们通过Ajax的形式进行数据请求。

官方文档有一个比较简单通俗的图,用来解释组件生命周期,示意图如下:

62c72103e27e4286c3d0f823b2c4df72.png

关于这几个生命周期的方法,目前我们常用的就是以下几个:

  • created: 我们常在这里进行Ajax的数据请求,用来获取数据。

  • mounted: 当组件完全被渲染至DOM中,在这里那可以操作相关的DOM内容,比如上篇文章的例子,我们对用户数据进行排序。

  • beforeDestroy: 在组件从DOM中被删除之前触发相关逻辑,在这里我们一般做些对象的释放清理工作。

这里我需要格外强调下,created 和 mounted 的区别:

created:在模板渲染成html前调用,即通常初始化某些属性值,然后再渲染成视图。

mounted:在模板渲染成html后调用,通常是初始化页面完成后,再对html的dom节点进行一些需要的操作。

接下来还是继续我们上篇文章的例子,如我们需要通过API获取数据,我们可以这样修改代码:

1b40c1a1ebd82b76d7e982f48c3b129b.png

这样,组件实例化创建成功后,就会通过API发起 Ajax 数据请求,并将数据结果返回给 data 的人员属性信息。

通过属性 props 配置数据展示

通过这些内容的学习,我们清楚的认识到UI组件的重用特性确实很方便,但是其真正魔力在于,组件的可配置性,我们可以自定义属性用于接收值的传递,可配置性大大增加了组件的灵活性,比如以下例子,我们在上篇头像组件里增加了一个src的属性,如下示例所示:

60db6b606121b293eb77684b46fbc2c3.png

属性的默认值和相关验证配置

Vue 让我们配置属性更加灵活,我们可以很方便的定义属性的类型,比如我们可以定义字符串、数字类型等,如下所示:

97a30d1cecbab4bf12f0f176adf88e5b.png

如果你尝试进行错误类型的传递,浏览器控制台将会收到警告信息。

除了可以做基本的类型验证外,我们可以做更多的验证,比如是否必填,我们需要只需要向将属性的字符串值改成对象的形式进行配置即可,如下代码所示:

1263984832ee253c185f40c8690213a5.png从上述代码你可以看出,我们在对象里增加 type、required 属性用来验证数据类型和属性是否必填,除了这几个属性,我们还可以配置 default(默认值)和 validate(自定义验证方法)。

默认值配置,如下代码所示:

9fd6142a1754b1b97f6c0b13f8259804.png

如果你需要做复杂的验证,你可以编写一个自定义函数,该函数返回一个布尔值即可,如下段代码所示

8bdd7f73180e69cc9464d52e1456258f.png

从上述代码,用于确保用户的角色在规定范围之内。

通过事件方法,在父子组件之间进行数据传值

通过上面的例子,我们清楚了单一组件怎么去接收值啦,如果组件之间进行嵌套,我们如何通过子组件向父组件传值呢,熟悉 React 的同学们,我们可以通过回调函数的形式进行传值,虽然Vue也可以这么做 ,但是我推荐大家用emit事件进行传值。

首先我们来先看下,如何在子组件的模板里定义DOM监听事件,其实定义很简单,使用$emit方法即可,示例代码如下:

SearchBox.vue

a8075a5a1857a59a74fa4b36a7fb2644.png

在上述代码中,我们创建了一个搜索按钮组件,包含一个输入框和一个搜索按钮,当按钮被点击时,其监听事件将会被触发,并将值进行传递,接下来我们来看看父组件是如何嵌套子组件的,代码如下:

父组件代码

19cbbe1f791fd70af36eea0aa2c128ef.png

从上述代码我们可以看出,在父组件里我们引入了 SearchBox 组件,添加search事件属性和对应的方法,当用户点击 SearchBox 组件时,子组件的监听事件将会被触发,调用我们指定的父组件定义的 onSearch 事件,并将参数 terms 传回父组件。

插槽(Slots)

到目前为止,我们展示的案例中组件都是在闭合的标签中,就是最外层的标签是闭合标签。这样做的目的就是方便组件之间进行自由组合。

那什么是插槽呢?以下是我的个人的理解:

简单的说,插槽就是可以让开发者自定义地往子组件中放置代码片段而开发出来的东西。就好像专门在某几个地方弄了几个槽(子组件中),我们开发时,就可以在对应的槽中放置对应的代码了。更通俗的讲,通过slot插槽向组件内部指定位置传递内容。

我们可以在子组件放置 标签,在组件渲染过程中,可以按照我们指定的内容对相应位置进行内容替换,比如我们有一个TodoList.vue的子组件,示例代码如下:

TodoList.vue

a0342b6c1ef43b3a94127a1ccfc9470c.png

父组件模板调用时

e99444eb8391dc4c1697f52f00755afc.png

上述这个例子,我们可以在TodoList组件的

  • 区域随意替换内容。

回调插入指定的内容

可以自定义自己的内容,当子组件被加载时,就好比回调函数一般,我们可以将返回的内容替换插槽的内容。

命名插槽(Named Slots)

你可以对组件的插槽进行命名,这就意味着你的模板有多个位置是你是可以自定义标记名称的,这就是所谓的语义化,大大提高了模板设计的灵活性,还是让我们来看个例子吧,比如我们要做个类似 Bootstrap 框架的卡片组件( card component ),我们需要在组件的插槽上标记header, footer, body。

HeaderFooterCard.vue (仅包含模板内容)

9f74115bf3a99e2cb3d0ffec29c28a11.png

在父组件内进行调用

76c7a79a66e53cc7957048600518420d.png

从上述的例子中,我们可以更加语义化的替换槽中指定的内容,我们不仅可以使用html内容进行替代,还能用其它Vue组件进行替换。

作用域插槽(Scoped Slots)

插槽还有一个比较有趣的功能就是作用域插槽,允许子组件访问父组件传过来的值,就好比变量的作用域。还是我们来看个例子,来理解吧,比如我们有个AjaxLoader的组件,代码如下:

AjaxLoader.vue

ef94d6be78db6c16a8ca939aee3469ce.png

父组件调用

032c8a6d524f8329847f274477af7acc.png

通过上述的例子,子组件通过 slot-scope 属性获取接口返回的数据,并将数据内容渲染至插槽指定的位置。

小节

今天的内容就和大家分享到这里,我们一起简单学习了组件的生命周期、如何定义组件属性、父子组件事件传值和槽的内容,今天的内容有点多,但是很重要,在下一篇文章,笔者将继续给大家分享路由相关的知识内容,敬请期待。

vue基础相关文章

「vue基础」新手快速入门篇

「vue基础」Vue相关构建工具和基础插件简介

「vue基础」手把手教你编写 Vue 组件(上)

专注分享当下最实用的前端技术。关注前端达人,与达人一起学习进步!

长按关注"前端达人"

4317b4a5a45e3d6ee913f33e662d4539.gif 2a2c1a69c73f9d47c9aec31679712768.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值