「React源码分析」四. React DOM操作之CSS属性操作分析

2021SC@SDUSC

前言

在传统Html开发或者JQuery开发时,我们可能首先需要选取到我们想要更新或删除等操作的元素,然后再进行相关操作。但在React中,大部分情况下我们并不需要通过查询 DOM 元素来更新组件的 UI,我们只需要关注设置组件的状态(setState),然后React会自动帮我们完成组件相应的更新。

React-DOM中编写了大量的方法来适配对浏览器DOM进行相关的操作。从这篇文章开始,将逐一分析React 17中react-dom部分的有关源码。希望通过这一系列文章,增进对ReactDOM的理解,了解React组件更新是具体如何反应到浏览器DOM层面的。

CSS属性操作源码分析

ReactDOM中对CSS属性的操作相关的源码编写在packages\react-dom\src\client\CSSPropertyOperations.js文件中。
在这里,定义了几个方法:createDangerousStringForStylessetValueForStylesisValueEmptyexpandShorthandMapvalidateShorthandPropertyCollisionInDev。下面对其逐一分析:

createDangerousStringForStyles

这个方法用来在DEV模式下检查SSR的正确性。它接收一个Style对象,返回序列化后生成的CSS样式字符串。

/**
 * This creates a string that is expected to be equivalent to the style
 * attribute generated by server-side rendering. It by-passes warnings and
 * security checks so it's not safe to use this value for anything other than
 * comparison. It is only used in DEV for SSR validation.
 * 创建预计与SSR生成的样式属性等价的字符串。它绕过了警告和安全检查,所以除了用于
 * 比较之外,使用这个值是不安全的。它只用于DEV环境下对SSR的检查。
 */
export function createDangerousStringForStyles(styles) {
   
  if (__DEV__) {
   
    let serialized = ''; // 序列化后的CSS字符串
    let delimiter = '';  // CSS间隔符,一开始为空字符串,后为;
    for (const styleName in styles) {
    // 遍历styles对象的所有key
      if (!styles.hasOwnProperty(styleName)) {
   
        continue;
      }
      const styleValue = styles[styleName];
      if (styleValue != null) {
    
        const isCustomProperty = styleName.indexOf('--') === 0;
        // 拼接属性名,如果是CSS自定义属性,直接拼接上去即可
        // 若是原生属性,将驼峰式命名转换成CSS的短横式命名
        serialized +=
          delimiter +
          (isCustomProperty ? styleName : hyphenateStyleName(styleName)) +
          ':'
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值