详解如何在React组件“外”使用父组件的Props


Posted in Javascript onJanuary 12, 2018

在写SDK项目的时候碰到一个问题:在直播间初始化SDK时使用默认主题,在专题页初始化SDK时使用其它主题。默认主题在打包时挂在全局环境下供多个页面使用,定制主题需要在初始化SDK的时候传入。

实现起来很简单,判断是否有定制主题,有就使用定制主题,没有就使用默认主题。项目下的基本组件大多是这样的:

import { h, Component } from 'lib/preact'
import csjs from 'lib/csjs'
import { theme } from 'lib/platform'

const styles = csjs`
  .app {
    background: ${theme.color};
  }
`

export default class App extends Component {
  render(
    <div className='styles.app'></div>
  )
}

定制主题是通过初始化SDK传进来的,子组件可以通过props或者context拿到,但是却不能在class外的styles里面直接使用。

那么如何实现在组件“外”使用父组件的Props呢?如果我们可以把需要使用的Props挂在“全局环境”下,那么不就可以随便使用了吗?

项目结构如下:

.
|——src
| |——lib //公用库
| |——services //抽离出的方法
| |——index.js
| └──App
|   └──app.js
└── ...

首先,在services中新建一个customTheme.js文件,内容如下:

let value = {}

export default () => {

 const setTheme = (initColor) => {
  value = initColor
 }

 const getTheme = () => {
  return value
 }

 return {
  setTheme,
  getTheme,
 }
}

在index.js文件中我们可以拿到初始化SDK时传入的定制主题对象,这里我们把这个对象存储到customTheme.js里的value中:

import customTheme from './services/customTheme'

...

const setTheme = (customTheme() || {}).setTheme
setTheme && setTheme(customTheme)

...

这样就可以在其它地方直接拿到customTheme的值了

import { h, Component } from 'lib/preact'
import csjs from 'lib/csjs'
import { theme } from 'lib/platform'
import customTheme from '../services/customTheme'
const getTheme = (customTheme() || {}).getTheme
const custom_theme = getTheme && getTheme()
const styles = csjs`
  .app {
    background: ${custom_theme.color || theme.color};
  }
`
export default class App extends Component {
  render(
    <div className='styles.app'></div>
  )
}

哈哈,就是这么简单,分享给跟我一样的菜鸟们,以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
用XMLDOM和ADODB.Stream实现base64编码解码实现代码
Nov 28 Javascript
一个轻量级的javascript库 pj介绍
Dec 19 Javascript
jquery each()源代码
Feb 14 Javascript
JavaScript 盒模型 尺寸深入理解
Dec 31 Javascript
文件编码导致jquery失效的解决方法
Jun 26 Javascript
Javascript 按位与赋值运算符 (&amp;=)使用介绍
Feb 04 Javascript
JS获取地址栏参数的几种方法小结
Feb 28 Javascript
jQuery中:last-child选择器用法实例
Dec 31 Javascript
javascript的tab切换原理与效果实现方法
Jan 10 Javascript
node.js实现端口转发
Apr 14 Javascript
深入理解Node.js中通用基础设计模式
Sep 19 Javascript
react组件基本用法示例小结
Apr 27 Javascript
vue使用element-ui的el-input监听不了回车事件的解决方法
Jan 12 #Javascript
微信小程序实现的涂鸦功能示例【附源码下载】
Jan 12 #Javascript
js 索引下标之li集合绑定点击事件
Jan 12 #Javascript
简单的Vue SSR的示例代码
Jan 12 #Javascript
详解如何在react中搭建d3力导向图
Jan 12 #Javascript
关于axios不能使用Vue.use()浅析
Jan 12 #Javascript
Vuex 进阶之模块化组织详解
Jan 12 #Javascript
You might like
java EJB 加密与解密原理的一个例子
2008/01/11 PHP
php自定义hash函数实例
2015/05/05 PHP
PHPExcel在linux环境下导出报500错误的解决方法
2017/01/26 PHP
PHP简单装饰器模式实现与用法示例
2017/06/22 PHP
在laravel框架中实现封装公共方法全局调用
2019/10/14 PHP
广告显示判断
2006/08/31 Javascript
jquery 插件学习(四)
2012/08/06 Javascript
jquery实现动态画圆
2014/12/04 Javascript
JS动态给对象添加事件的简单方法
2016/07/19 Javascript
使用plupload自定义参数实现多文件上传
2016/07/19 Javascript
细数JavaScript 一个等号,两个等号,三个等号的区别
2016/10/09 Javascript
vue watch自动检测数据变化实时渲染的方法
2018/01/16 Javascript
vue实现微信分享功能
2018/11/28 Javascript
vue工程全局设置ajax的等待动效的方法
2019/02/22 Javascript
[13:21]DOTA2国际邀请赛采访专栏:RSnake战队国士无双,Fnatic.Fly
2013/08/06 DOTA
[41:52]2018DOTA2亚洲邀请赛3月29日小组赛B组Effect VS Secret
2018/03/30 DOTA
Cython 三分钟入门教程
2009/09/17 Python
Python中使用gzip模块压缩文件的简单教程
2015/04/08 Python
Linux下为不同版本python安装第三方库
2016/08/31 Python
Python实现的根据IP地址计算子网掩码位数功能示例
2018/05/23 Python
python之验证码生成(gvcode与captcha)
2019/01/02 Python
python opencv minAreaRect 生成最小外接矩形的方法
2019/07/01 Python
Python获取统计自己的qq群成员信息的方法
2019/11/15 Python
django在开发中取消外键约束的实现
2020/05/20 Python
Python通过文本和图片生成词云图
2020/05/21 Python
CSS3下的渐变文字效果实现示例
2018/03/02 HTML / CSS
Shopee新加坡:东南亚与台湾电商平台
2019/01/25 全球购物
俄罗斯在线水暖商店:Perfecto.ru
2019/10/25 全球购物
几个常见的消息中间件(MOM)
2014/01/08 面试题
博士生入学考试推荐信
2013/11/17 职场文书
上班看电影检讨书
2014/02/12 职场文书
竞选学习委员演讲稿
2014/09/01 职场文书
大学生见习报告范文
2014/11/03 职场文书
父亲去世追悼词
2015/06/23 职场文书
2019奶茶店创业计划书范本!
2019/07/15 职场文书
Django实现drf搜索过滤和排序过滤
2021/06/21 Python