「Solid.js项目实战」礼品发放Web应用之三

「Solid.js项目实战」礼品发放Web应用之三

「Solid.js项目实战」礼品发放Web应用之二「Solid.js项目实战」礼品发放Web应用之一

功能介绍

本文将继续上一篇文章的内容,Signal和Effect是整个Solid响应系统的基础,我们再通过一个礼品列表实例演示下使用Signal控制界面的方法。之后介绍了需要对代码执行组件化的一个情景,展示了代码是如何随着业务的需要而不断地进行组件化,它可能是由于某个组件的功能过于复杂了,也可能是由于组件中出现了冗余的代码。最后,介绍了组件之间进行通讯的一种机制-props,props实现了父组件向子组件传递数据的功能。

列表数据

Solid的Signal的初始状态不仅仅是一个数值,它还可以是一个对象或一个数组。礼品列表数据目前使用的是HTML的值,只有第一个列表项的内容将礼品的数量值绑定到了一个Signal上,它在上一篇文章《礼品发放Web应用之二》中我们采用了Signal方式实现的。现在我们需要实现的功能是将整个礼品列表中的所有数据(包括礼品的名称和数量)全部绑定到Signal上。我们使用一个含有三个属性的对象表示礼品的数据信息,它的三个属性是id属性、name属性和count属性。将4个列表项保存到一个数组giftData中,如下图1所示。

图1

图1中id属性唯一地标识了一个礼品对象,但它不会显示在礼品列表界面上。礼品对象数组建立之后,创建礼品列表数组所对应的Signal,并将giftData数组作为Signal的初始值,如下图2所示。

图2

图2中第27行代码创建了一个Signal对象,之后通过使用gifts获取礼品数组,通过setGifts修改礼品数组。

与普通的Signal用法相同,但是这个Signal的返回值类型为数组类型,在使用时需要像访问数组的方式使用它,比如获取第一个礼品的方式为gifts()[0],计算礼品个数的方式为gifts().length。我们使用这个Signal来实现Gift组件,如下图2所示

图3

图3中第34行代码的第一个表达式gifts()[0].name的含义是:调用礼品列表Signal的getter方法gifts()获取到当前Signal的礼品数组,通过下标0访问数组中的第一个礼品对象,最后获取到礼品对象的name属性,这样礼品的名称就显示到span元素中了。第34行代码的第二个表达式gifts()[0].count与第一个表达式只有在最后获取对象属性时有所不同,其它的操作是完全相同的,它表示的是获取这个礼品对象的数量值。同样的道理,第37、40和43行代码分别获取数组中不同位置的礼品对象,并设置对应的礼品名称和数量。

当看到图3中的代码时,这4个礼品项目界面的布局是完全相同的,我们可以将它抽象为一个更小的组件,我们将其命名为GiftItem组件,将其定义为如下的代码:

图4

图4中的代码使用了gifts中的第一个礼品对象,但是其它的3个礼物对象也应该使用对应的索引值获取各自的礼品对象,而不是一直使用同样的数据,这样就需要提供一种机制将图4中第33行代码中的表达式改为动态的,即允许从组件的外部传递参数进来,GiftItem组件依据不同的参数展现不同的内容。这就是Solid提供的组件间数据交互的props机制。

Props

Props是Solid提供给组件与它的子组件进行交互的一种机制。在子组件中定义一个props参数,并在使用这个属性的地方通过props访问属性名字,父组件就像使用普通的HTML属性一样设置它的数值即可,如下图5所示

图5

图5中第30行代码将props作为组件GiftItem的一个参数,第33行代码使用props.gift获取父组件传递给这个组件的gift属性,这个gift属性是礼品对象,所以可以通过.name和.count分别获取它的名称和数量。与图4中的组件相比,这个组件实现了参数传递功能,实现此功能之后,我们就可以将每一个组件所对应的礼品对象通过gift属性传递给GiftItem组件,组件便会自己执行渲染操作。

图6

使用GiftItem组件之后礼品列表组件的内容简化为图6中的模样了,相比之前的代码,清晰了许多。什么?丢失了一个功能!是的,之前的礼品列表中第二项选中效果被弄没了,没关系,我们将列表选中效果再通过props实现一遍。

组件中的props参数对使用的属性数量是没有限制的,它可以指定多个属性名称。比如我们将selected作为一个props的属性传递至GiftItem组件,如下图7所示。

图7

图7中在GiftItem组件中添加对selected类的使用,第32行代码将其作为p元素classList属性的selected的属性值,如果props中的selected为真值,那么,selected类就会应用到这个p元素上,反之,则不会添加selected类。修改完成子组件GiftItem之后,我们再回到父组件Gift中将属性selected值设置为真值,如下图8第42行代码所示,当selected为真值时,第2个列表项GiftItem中的selected类就会生效,即显示出选中效果。

图8

总结

Solid提供的Signal状态支持多种的数据类型,用户只需要在获取和设置对应的类型时正确地按照对象类型操作就可以,如果是数组,那么就按照数组方式访问它,如果是对象就按照对象的方式使用它。但是需要时刻谨记createSignal的返回值数组元素为两个函数,而不是状态数值。

Solid为父子组件之间提供了数据交互方式-props,通过props我们就可以实现将父组件中的数据传递给子组件,子组件便称为了一个动态的组件,它所显示内容可以依照父组件提供的值而显示。

谢谢阅读,我们下一篇文章见。

「Solid.js项目实战」礼品发放Web应用之二「Solid.js项目实战」礼品发放Web应用之一

郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
用户投稿
上一篇 2022年6月22日 21:20
下一篇 2022年6月22日 21:21

相关推荐

  • 30个无加盟费的项目(茶颜悦色奶茶店加盟费多少)

    茶颜悦色又爆了,8月18日,茶颜悦色南京门店正式开业,开张不到半小时,门店就人满为患,消费者的购买热情十分高涨,而由于人流量过大造成拥堵,茶颜悦色也不得不暂停营业。 当然,这里面排…

    2022年11月27日
  • 存储过程语法(sql server存储过程语法)

    今天小编给各位分享存储过程语法的知识,其中也会对sql server存储过程语法进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧! oracle存储过程基本语法…

    2022年11月26日
  • 净利润率越高越好吗(净利润率多少合适)

    一、持续增收不增利,平均净利润率首次跌入个位数 2021年,增收不增利依旧是行业主流。具体来看,大部分企业营业收入呈增长态势,E50企业平均同比增速达到17.3%,但是利润增速则明…

    2022年11月26日
  • 《宝可梦朱紫》獒教父属性是什么?獒教父属性一览

    宝可梦朱紫里獒教父是一只很强的宝可梦,很多玩家不清楚獒教父的属性是什么样的,下面就给大家带来宝可梦朱紫獒教父属性一览,感兴趣的小伙伴一起来看看吧,希望能帮助到大家。 獒教父属性一览…

    2022年11月25日
  • 《宝可梦朱紫》太晶化强力宝可梦推荐 太晶化哪些宝可梦最强?

    宝可梦朱紫游戏中宝可梦种类繁多,不过有的宝可梦比较强,有的稍弱一些,那么太晶化化哪些宝可梦最强呢,为了便于大家更好的体验游戏,这里给大家带来了宝可梦朱紫太晶化强力宝可梦推荐,一起来…

    2022年11月25日
  • 宝可梦朱紫四大天王属性怎么样 四大天王属性数值介绍

    宝可梦朱紫四大天王属性如何?四大天王的属性数值玩家们还是挺好奇的,想要了解四大天王属性的可以看看下面小编的介绍,小编会把四大天王的属性数值全都分享在下面,各位赶紧来小编这里多了解一…

    2022年11月25日
  • 宝可梦朱紫皮卡丘多少级进化 皮卡丘进化条件攻略

    宝可梦朱紫皮卡丘进化条件是什么?皮卡丘怎么进化?作为最受欢迎的电属性宝可梦,大家都很想知道皮卡丘进化的方法,今天小编这就在下面的攻略中分享皮卡丘进化条件,各位可以赶紧来小编这里了解…

    2022年11月25日
  • 规范透明促PPP高质量发展——16万亿元大市场迎来新规

    近日,财政部印发《关于进一步推动政府和社会资本合作(PPP)规范发展、阳光运行的通知》,从做好项目前期论证、推动项目规范运作、严防隐性债务风险、保障项目阳光运行四个方面进一步规范P…

    2022年11月25日
  • 什么是推广cpa一篇文章带你看懂CPA推广渠道

    CPA渠道 CPA指的是按照指定的行为结算,可以是搜索,可以是注册,可以是激活,可以是搜索下载激活,可以是绑卡,实名认证,可以是付费,可以是浏览等等。甲乙双方可以根据自己的情况来定…

    2022年11月25日
  • 推荐3种白手起家的赚钱项目(白手起家赚钱项目有哪些)

    如今社会压力非常的大,家有老少要养活,这些都加速了穷人想要创业的欲望,但是创业路总是那么的艰难,资金就是创业的重头戏,所以选择一个低成本又赚钱的项目是大多数人最期望的了,那么有哪些…

    2022年11月25日

联系我们

联系邮箱:admin#wlmqw.com
工作时间:周一至周五,10:30-18:30,节假日休息