日常开发中通常会有一些需求,需要定义一些全局通用的组件,在 Vue 里是有这样的功能,但是在 React 里,没有见过有类似的做法,通常都是在需要的时候引入组件,原则上在 Jsx 里只允许 html 的文本标签以及 function 类型的标签,本文的做法只做参考

背景

最近在考虑做国际化,但是系统构建之初,产品并没有做国际化的计划,系统开发上线以后,又有了国际化的需求,但是系统已经上线,这时候在去用 react-i18n 之类的方案太重了,所有的页面、组件都要引用这个库,需要国际化的地方都需要修改,同时要维护语言的映射文件,工作量太大了,所有考虑一种更好的方案,思考如何能无侵入的实现国际化,这里的构建自定义标签的目的是希望通过标签收集系统文字。

示例代码:

render(){

return (

需要翻译的文字

需要翻译的文字

)

}

所有 local 标签或者加了 translate="yes" 的标签里的文字都需要被翻译,translate是 HTML5 的新属性,这里借用它。

自定义标签有哪些方案

编译期转换

一般通过编译期转换是可以做到的,但是需要开发相关 webpack loader ,调整生成的代码,这么做比较麻烦。

运行期实现

运行期做的话,可以在 render 里拿到虚拟DOM子节点,遍历,找到自定义的标签,然后特殊处理,返回新的虚拟 DOM,之前做了一个表单的方案,就是用这种方案来做的。

另一种做法,最近想到的,也是本文的重点,就是重写 React.createElement,重写 React.createElement 这个操作在某些场景还是挺有用的,这些操作在 React 开发下都是非常规操作,让代码看起来有点儿怪,但是用起来还是比较香的。

自定义标签

参考实现:

function createTag(React, tags: ITags = {}) {

if (!tags) {

return;

}

const createElement = React.createElement;

React.createElement = function (type, props, ...children) {

if (tags[type]) {

return createElement(tags[type], props, ...children);

}

return createElement(type, props, ...children);

}

}

在应用的入口处使用:

import React, { Component } from 'react';

const Local=(props)=>{

// 各种操作 return props.children;

}

createTag(React,{

'local':Local

})

这样,就可以在应用的任何地方使用 local 标签了,比如可以自定义一个 loading 标签。

这里不仅是加了一个文本标签,同时也接管里这个标签的内部实现逻辑,也可以有自己的状态,和下面的代码还是有区别的,下面的代码是动态修改 type 参数。

const Wrap = ({ tagName, content }) => {

const Tag = `${tagName}` // variable name must begin with capital letters

return {content}

}

自定义属性

这里是对虚拟DOM做了过滤,如果有对应的属性,那么执行回调,做相关的操作。

function createAttribute(React, attribute, callback) {

if (!attribute) {

return;

}

const createElement = React.createElement;

React.createElement = function (type, props, ...children) {

if (props && typeof props[attribute] !== 'undefined') {

return callback(type, props, ...children);

}

return createElement(type, props, ...children);

}

}

使用:

import React, { Component } from 'react';

createAttribute(React,'translate',(type,props,children)=>{

// 各种操作 return (

{children}

)

})

这样,应用里所有加了 translate 属性标签,都会被收集到,返回的内容就可以自定义了。

看起来挺有意思吧。。。

总结

本文通过重写 React.createElement 实现全局的标签和属性定义,某些场景下是挺有意义的,挺有意思,在这分享一下。

补一条招聘信息,团队正在招人,我们是58集团招聘事业部前端团队,主要是做招聘行业的sass系统,内部也有些有意思的项目,有意向的话可以私信我或发简历到 lihongyin@58.com

react 替换标签内容_如何在 React 里自定义标签和属性?相关推荐

  1. react js 添加样式_如何在React JS Application中添加图像?

    react js 添加样式 Hello! In this article, we will learn how to add images in React JS? I remember when I ...

  2. react前端显示图片_如何在react项目中引用图片?

    如何在react项目中引用图片?本文码云笔记将为大家整理在react项目中插入图片以及背景图片的方法,希望对需要的小伙伴提供一些参考. 在react项目中插入图片以及背景图片的方法共有2种: 1.im ...

  3. 如何在JSP里自定义标签

    自定义标签是用户定义的JSP语言元素.当JSP页面包含一个自定义标签时将被转化为servlet,标签转化为对被 称为tag handler的对象的操作,即当servlet执行时Web containe ...

  4. python字符串标签转化_如何在TensorFlow中将字符串标签转换为一个热向量?

    我是TensorFlow的新手,想读一个逗号分隔值(csv)文件,它包含两列,第1列是索引,第2列是标签字符串.我有以下代码,它逐行读取csv文件中的行,并且我能够使用print语句正确地获取csv文 ...

  5. python 标签 轴_如何在matplotlib中将轴标签对齐到右侧或顶部 - python

    默认情况下,matplotlib将轴标签绘制在轴的中心.我想以水平轴和垂直轴都与轴的末端对齐的方式移动标签.例如,对于水平轴,我希望看到: +--------------------+ | | | | ...

  6. react网格生成_如何在React中构建实时可编辑数据网格

    react网格生成 by Peter Mbanugo 彼得·姆巴努戈(Peter Mbanugo) 如何在React中构建实时可编辑数据网格 (How to Build a Real-time Edi ...

  7. react 交互_如何在React应用程序中跟踪用户交互

    react 交互 by Faouzi Oudouh 通过Faouzi Oudouh 如何在React应用程序中跟踪用户交互 (How to track user interactions in you ...

  8. react 动态修改路由_升级到 React Router 4 并实现动态加载和模块热替换

    这篇文章是升级到Webpack2坑--模块热替换失效页面不自动刷新?的后续.那篇文章主要说明了,升级到 Webpack 2 之后,通过升级webpack-dev-server和react-hot-lo ...

  9. react 日期怎么格式化_手写React的Fiber架构,深入理解其原理

    熟悉React的朋友都知道,React支持jsx语法,我们可以直接将HTML代码写到JS中间,然后渲染到页面上,我们写的HTML如果有更新的话,React还有虚拟DOM的对比,只更新变化的部分,而不重 ...

最新文章

  1. elasticsearch从入门到出门-01windows上安装使用
  2. git切换ssh和http协议
  3. dataframe 众数的方法_数据分析师最常用的数据分析方法。你都掌握了吗?
  4. WPF:ListView数据绑定及Style
  5. boost::proto::protect相关的测试程序
  6. (pytorch-深度学习系列)pytorch数据操作
  7. Python定时任务-schedule vs. Celery vs. APScheduler
  8. 桂林理工计算机与科学技术,桂林理工大学信息科学与工程学院
  9. 数学(FFT):BZOJ 3527 [Zjoi2014]力
  10. ios项目使用ProtocolBuffer
  11. 话说P2P理财纷纷暴雷之后,那些投资者的钱去了哪里?
  12. C++ 构造函数体内赋值与初始化列表的区别
  13. 音频杂音问题_OBS直播出现杂音或者电流声、没声音或者调大音量等操作
  14. mysql介绍索引类型的章节_MySQL索引类型介绍
  15. layui富文本编辑器
  16. linux HUSTOJ 一些页面修改
  17. 微信微粒贷开通什么条件?微粒贷开通方法及流程
  18. Hopscotch(POJ-3050)
  19. 【opencv】18.数字图像一阶导数、二阶导数的数学原理
  20. 只保留QQ拼音输入法的设置

热门文章

  1. 抵挡不住的黑色诱惑,华为P10 Plus亮黑版真机图赏
  2. 汉朝书法家蔡邕、刘德昇、张芝
  3. css消除全部css_消除旧版浏览器中CSS3头痛
  4. android编译时出现cannot find symbol
  5. org.apache.tomcat.util.http.fileupload.impl.FileSizeLimitExceededException: The field file exceeds i
  6. 【c++常见错误01】error C2662: ‘const xxx‘: cannot convert ‘this‘ pointer from ‘xxx‘ to ‘xxx‘
  7. Docker热迁移研究背景,问题描述及解决方案
  8. 湖北立捷科技:淘宝商品发布规则介绍
  9. gd32F103C8T6 flash填坑
  10. 【ESP32】分区表