day02作业

购物车全选和总价实现

需求: 简单的购物车的全选和总计的功能实现,这里用到了状态提升,涉及到父传子、子传父,兄弟之间的数据的传递

页面基本结构

  • 布局相应的结构,每一个li里面要设置的内容比较多,所以我们把li单独抽取成一个组件

  • 对应的css代码

加减按钮的点击事件处理

  • 结构写完后,现在页面上可以看到对应的效果,但是点击按钮的逻辑没有实现,此时需要给 + - 按钮添加点击事件

  • 利用子传父的方式,我们需要在父组件中定义两个回调函数,分别对应 +(add) 和 -(reduce)

  • 然后把这两个回调函数设置到子组件的属性上,通过props传递到子组件

  • 给子组件添加点击事件(childAdd、childReduce),当点击了后,调用 通过props传递过来的函数

  • 调用这个函数的时候需要传递一个数据,就是商品的id,这样在父组件的方法中才能知道用户点击的是哪一个商品

  • 拿到传递过来的id后,需要遍历 carts的数组,判断是否与传递过来的id相同,如果相同,修改相应的数量,然后通过this.setState() 来更新UI

子组件的checkbox状态更改

  • 需要把checkbox做成受控组件,受控的值是有父组件传递过来的商品对象里面的isCheck的值,所以我们需要给checkbox绑定 onChange事件

  • onChange事件里面,需要调用父组件的函数,来修改对应的isCheck的值,这里就需要父组件定义一个回调函数(onCheckStatus),通过props传递给子组件

  • 调用父组件对应回调函数的时候需要携带两个参数,一个是当前选中的状态,一个是对应商品的id

  • 在父组件的回调函数里面获取到两个值之后,需要遍历当前carts,判断id是否相同,如果相同,修改对应的状态

  • 还需要完成一件事,判断一下当前所有的商品的isCheck的值是否为true,如果是true,需要更改一下全选的状态

  • 调用一下 this.setState() 来更新UI

全选按钮的状态更改

  • 给全选按钮设置一个状态(allCheckStatus),绑定 onChange事件

  • 在事件处理逻辑中,把当前状态赋值给state里面的状态

  • 同步更新子组件里面的状态,遍历carts,把所有商品对象的isCheck状态设置与allCheckStatus的一致

  • 然后利用 this.setState() 来更新UI

总价更新

  • 在父组件的 state里面定义 状态(total)

  • 在每一次更新UI的时候(+按钮、-按钮、单选、全选),都需要遍历一下carts,判断商品对象的isCheck的属性是否是true,如果是true代表选中,累加到total上即可

示例代码

温度计

需求:当用户输入 摄氏温度,我们需要把值转成华氏度,如果摄氏温度没有达到100,下面显示水还没有沸腾,否则显示沸腾了,这里用到了状态提升,涉及到父传子、子传父,兄弟之间的数据的传递

页面的基本结构

摄氏度和华氏度转换工具

温度的相互转换

  • 摄氏度和华氏度两个子组件是兄弟关系,数据要通过父组件来进行共享,所以需要在父组件上定义一个温度的状态(temperature),以及温度类型的状态(scale)

  • 父组件还需要提供回调函数,当子组件触发了,两个触发点,需要定义两个回调函数,摄氏度(handleCelsiusChange)、华氏度(handleFahrenheitChange)

  • 把这两个函数当前子组件的属性,属性名相同,属性值不同,这样子组件只需要调用相应的属性名即可,通过props传递到子组件中

  • 在子组件的输入框绑定 onChange 事件,在事件处理逻辑里面调用 传递过来的回调函数,把当前输入的值传递给父组件

  • 父组件拿到相应的值后,通过this.setState() 方法更新里面的数据

  • 一旦调用了this.setState() 方法,就会导致render方法重新执行,在这里我们需要对温度的值进行换算

  • 通过state状态里面的scale来判断是华氏度还是摄氏度,相应调用一下转换工具函数,把结果设置到对应的子组件的函数属性中

示例代码

最后更新于

这有帮助吗?