「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)删除。
(0)
用户投稿
上一篇 2022年6月22日
下一篇 2022年6月22日

相关推荐

  • 搭建低代码平台plus代码生成器的集成

    mybatis-plus提供了代码自动生成器;使用代码生成器可以根据数据库表结构生成我们需要的代码结构,节省了我们建各种类的时间。 以下是集成mybatis-plus代码生成器的具…

    2022年7月21日
  • 华为占据中国折叠屏市场半壁江山,Mate Xs 2引领折叠屏手机新风向

    武大靖最喜欢的一句话是“真正的强者,即使咬牙坚持也要把事情做好。”2014年,他在冬奥会500米短道速滑项目中首次获得银牌。后来他先后在世界锦标赛和平昌冬奥会短道速滑项目中夺得金牌…

    2022年7月29日
  • 6个月内彻底改变你生活的三个方式

    我们在这个快节奏的世界里紧赶慢赶,不管外界的环境是刮风还是下雨,我们都要风雨无阻地跟上,普通人的生活并不容易,很多时候都要为了生活而忧愁。 我想每个人都曾经历过生活黑暗的时刻,又或…

    2022年7月29日
  • 美国在50年前就登月过了,为何不直接发射去月球?有何内幕?

    何解? 8月22日,美国国家航天局宣布,美国新一代登月火箭“太空发射系统”定于29日搭载“猎户座”飞船升空,执行“阿耳忒弥斯1号”无人绕月飞行测试任务。 美国在50年前就登月过了,…

    2022年8月26日
  • 《Dota》有哪个英雄的改动让你最心痛?

    dota为了游戏的平衡,总会一直推出新版本。对于某些强势的英雄进行削弱,而弱势的英雄进行加强。但是对于一些英雄的大改,几乎使的一个英雄的打法出现了翻天覆地的改变!有一些英雄的技能被…

    2022年7月6日
  • 40岁以后有哪些项目医生不建议做

    1.动下颌角和颧骨 很多求美者想通过削骨获得瓜子脸,小脸确实显年轻,但是对于四十岁以后的求美者来说,动骨头就是一条错误的路了。首先年纪大增加了风险性,恢复期也更长。其次面部衰老以后…

    2022年7月16日
  • 乔治官宣决定!库里又是第一,湖人盯上优质前锋,大白边示好两队

    今年休赛期未免有一些无聊,大家期待的交易没有出现,联盟格局也就是那个样,和上赛季基本差不多。休赛期就是这样,有需求的球队就做交易,没有需求的球队就等着看好戏。那么就近期NBA休赛期…

    2022年8月8日
  • “保交楼”是房地产业健康发展重要基础

    本报评论员 樊大彧 房地产企业是“保交楼”的责任主体,一些房企正积极处置资产、多方筹措资金,努力提升工程进度。一些地方政府为了防范房地产企业风险外溢,也着手积极帮助企业做好“保交楼…

    2022年8月31日
  • 广东医院项目Flink开发需求:定时定量窗口触发器(从入门到精通)

    背景 最近有局点客户有这么一个场景:利用Flink CDC读取MySql数据binlog日志,然后使用窗口进行聚合统计,遇到的问题就是Flink现有窗口的触发机制(定时或者定量)、…

    2022年6月20日
  • 2022年iPhone序列号开头字母最新含义,你还不知道吗?

    iPhone手机因为其精致的外观和流畅的系统,所以在国内一直饱受大家的喜爱,而iPhone手机的市场保有量也是国内最高的,正因如此iPhone也被一些不良商家改装成改码机、扩容机和…

    2022年8月2日

联系我们

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