详解如何在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 相关文章推荐
优化 JavaScript 代码的方法小结
Jul 16 Javascript
js键盘上下左右键怎么触发function(实例讲解)
Dec 14 Javascript
js传值后台中文出现乱码的解决方法
Jun 30 Javascript
js中toString()和String()区别详解
Mar 23 Javascript
ECMAScript6--解构
Mar 30 Javascript
angular bootstrap timepicker TypeError提示怎么办
Jun 13 Javascript
解决vue中对象属性改变视图不更新的问题
Feb 23 Javascript
详解Vue开发微信H5微信分享签名失败问题解决方案
Aug 09 Javascript
vue input输入框关键字筛选检索列表数据展示
Oct 26 Javascript
JS实现动态倒计时功能(天数、时、分、秒)
Dec 12 Javascript
原生JS实现记忆翻牌游戏
Jul 31 Javascript
Vue实现菜单切换功能
Nov 08 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
PHP 加密与解密的斗争
2009/04/17 PHP
PHP imagegrabscreen和imagegrabwindow(截取网站缩略图)的实例代码
2013/11/07 PHP
php文件上传你必须知道的几点
2015/10/20 PHP
PHP常见漏洞攻击分析
2016/02/21 PHP
php+ajax实现带进度条的上传图片功能【附demo源码下载】
2016/09/14 PHP
PHP 实现页面静态化的几种方法
2017/07/23 PHP
php命令行模式代码实例详解
2021/02/26 PHP
详解jQuery中的元素的属性和相关操作
2015/08/14 Javascript
jquery中object对象循环遍历的方法
2015/12/18 Javascript
jquery checkbox无法用attr()二次勾选问题的解决方法
2016/07/22 Javascript
package.json文件配置详解
2017/06/15 Javascript
Angular指令之restict匹配模式的详解
2017/07/27 Javascript
vue.js 使用axios实现下载功能的示例
2018/03/05 Javascript
vue动态子组件的两种实现方式
2019/09/01 Javascript
python计算程序开始到程序结束的运行时间和程序运行的CPU时间
2013/11/28 Python
Python获取Redis所有Key以及内容的方法
2019/02/19 Python
使用python+whoosh实现全文检索
2019/12/09 Python
PyCharm2019 安装和配置教程详解附激活码
2020/07/31 Python
python字典通过值反查键的实现(简洁写法)
2020/09/30 Python
Python pip 常用命令汇总
2020/10/19 Python
Python文件名匹配与文件复制的实现
2020/12/11 Python
如何用python实现一个HTTP连接池
2021/01/14 Python
美国最大的袜子制造商和零售商:Renfro Socks
2017/09/03 全球购物
娇韵诗俄罗斯官方网站:Clarins俄罗斯
2020/10/03 全球购物
POS解决方案:MUNBYN(热敏打印机、条形码扫描仪)
2020/06/09 全球购物
自考生自我鉴定范文
2013/10/01 职场文书
国贸专业个人求职信分享
2013/12/04 职场文书
庆八一活动方案
2014/01/25 职场文书
乡镇干部先进事迹材料
2014/02/03 职场文书
2014预备党员批评与自我批评思想汇报
2014/09/20 职场文书
国土资源局开展党的群众路线教育实践活动整改措施
2014/09/26 职场文书
2014年银行信贷员工作总结
2014/12/08 职场文书
傲慢与偏见读书笔记
2015/06/29 职场文书
2016入党积极分子党课学习心得体会
2015/10/09 职场文书
交通事故协议书范本
2016/03/19 职场文书
Python爬虫基础之简单说一下scrapy的框架结构
2021/06/26 Python