react render propsGetter

栏目: IOS · Android · 发布时间: 5年前

内容简介:通过上篇的介绍,我们可以把一些常见的属性封装到一个辅助方法里,让我们对这部分的使用更加方便。但这样并不是非常的完美,因为有些时候我们需要获取其部分属性,还有部分场景下可以追加自己的事件。比如之前的案例中,我们在toggle组件使用中,针对on属性需要显性的作为入参才可以使用,追加的onclick事件不但希望触发toggle事件,也希望可以进行自定义事件的触发

通过上篇的介绍,我们可以把一些常见的属性封装到一个辅助方法里,让我们对这部分的使用更加方便。

但这样并不是非常的完美,因为有些时候我们需要获取其部分属性,还有部分场景下可以追加自己的事件。

获取设置属性

比如之前的案例中,我们在toggle组件使用中,针对on属性需要显性的作为入参才可以使用,追加的onclick事件不但希望触发toggle事件,也希望可以进行自定义事件的触发

function Usage({
  onToggle = (...args) => console.log('onToggle', ...args),
}) {
  return (
    <Toggle onToggle={onToggle}>
      {({on, togglerProps}) => (
        <div>
          <Switch on={on} {...togglerProps} />
          <hr />
          <button aria-label="custom-button" {...togglerProps}>
            {on ? 'on' : 'off'}
          </button>
        </div>
      )}
    </Toggle>
  )
}
复制代码

将属性进行封装,事件的部分进行封装

增加额外获取属性方法

getStateAndHelpers() {
    return {
      on: this.state.on,
      toggle: this.toggle,
// 增加额外的属性 用于给函数的子组件方便获取任意需要的属性
      getTogglerProps: this.getTogglerProps,
    }
  }
复制代码

定义getTogglerProps方法

不仅要考虑到封装好所有的props属性,也要封装其他的需要属性,比如aria-pressed的属性,以及对特殊OnClick进行事件的绑定,与此同时也让其触发toggle原本的方法

getTogglerProps = ({onClick,className, ...props} = {}) => ({
    'aria-pressed': this.state.on,
    onClick: callAll(onClick, this.toggle),
// 如果你想添加额外的className进行支持  在其传入时 进行添加
className:`${className} our-custom-class-name`
    ...props,
  })
复制代码

定义callAll 方法 执行

需要额外注意的是,前面要追加fn &,因为追加的事件是需要显性定义然后才执行的,而如果是toogle本身的点击是不需要定义点击事件的,直接执行事件会报错。

const callAll = (...fns) => (...args) =>
  fns.forEach(fn => fn && fn(...args))
复制代码

使用时的外部事件以及使用差异

function Usage({
  onToggle = (...args) => console.log('onToggle', ...args),
// 额外的点击事件
  onButtonClick = () => console.log('onButtonClick'),
}) {
  return (
    <Toggle onToggle={onToggle}>
      {({on, getTogglerProps}) => (
        <div>
// on属性通过getTogglerProps 赋值
          <Switch {...getTogglerProps({on})} />
          <hr />
// 试想你会怎么写?你可能会写一个行内函数 ?如果我们直接只写自己的事件,那么toggle的切换就无法完成;但写成这样toogle内就不方便修改或者外部使用时外部与组件内触发的事件本就是不同的。
<button
          {...togglerProps}
            'aria-label': 'custom-button',
            id="custom-button-id",
            onClick: {( => {
              onButtonClick()
              togglerProps.onClick()
            })},
        >
          {on ? 'on' : 'off'}
        </button>
// 将点击事件单独作为属性传入,默认执行其默认的点击,同时将其属性一次性封装传入
          <button
            {...getTogglerProps({
              'aria-label': 'custom-button',
              onClick: onButtonClick,
              id: 'custom-button-id',
            })}
          >
            {on ? 'on' : 'off'}
          </button>
        </div>
      )}
    </Toggle>
  )
}
复制代码

小结

看上去有点乱,我简单梳理下当我们的组件事件除了使用组件之外,希望方便的获取组件属性,或者需要针对一些组件事件增加额外的事件逻辑而进行一定的解耦,那么可以通过额外定义一个getToggleProps的方法来简化操作,也可以用来支持业务特殊的组件回调函数方便解耦。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

用户体验要素

用户体验要素

Jesse James Garrett / 范晓燕 / 机械工业出版社 / 2011-7-1 / 39.00元

《用户体验要素:以用户为中心的产品设计(原书第2版)》是AJAX之父Jesse James Garrett的经典之作。本书用简洁的语言系统化地诠释了设计、技术和商业融合是最重要的发展趋势。全书共8章,包括关于用户体验以及为什么它如此重要、认识这些要素、战略层、范围层、结构层、框架层、表现层以及要素的应用。 《用户体验要素:以用户为中心的产品设计(原书第2版)》用清晰的说明和生动的图形分析了以......一起来看看 《用户体验要素》 这本书的介绍吧!

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试