详解如何在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 相关文章推荐
基于jQuery的左右滚动实现代码
Dec 03 Javascript
javascript学习笔记(二)数组和对象部分
Sep 30 Javascript
jQuery简单实现网页选项卡特效
Nov 24 Javascript
JQuery中extend的用法实例分析
Feb 08 Javascript
JavaScript实现表格点击排序的方法
May 11 Javascript
vue子组件使用自定义事件向父组件传递数据
May 27 Javascript
JavaScript的Object.defineProperty详解
Jul 09 Javascript
浅析Vue.js中v-bind v-model的使用和区别
Dec 04 Javascript
实例详解vue中的$root和$parent
Apr 29 Javascript
解决Layui数据表格的宽高问题
Sep 28 Javascript
使用Vue生成动态表单
Nov 26 Javascript
在Webpack中用url-loader处理图片和字体的问题
Apr 28 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
source.php查看源文件
2006/12/09 PHP
使用pthreads实现真正的PHP多线程(需PHP5.3以上版本)
2014/05/05 PHP
PHP添加PNG图片背景透明水印操作类定义与用法示例
2019/03/12 PHP
php获取目录下所有文件及目录(多种方法)(推荐)
2019/05/14 PHP
PHP正则之正向预查与反向预查讲解与实例
2020/04/06 PHP
Avengerls vs Newbee BO3 第三场2.18
2021/03/10 DOTA
javascript 多种搜索引擎集成的页面实现代码
2010/01/02 Javascript
麻雀虽小五脏俱全 Dojo自定义控件应用
2010/09/04 Javascript
JavaScript中:表达式和语句的区别[译]
2012/09/17 Javascript
js获取html参数及向swf传递参数应用介绍
2013/02/18 Javascript
jquery $.trim()方法使用介绍
2014/05/21 Javascript
JavaScript中的pow()方法使用详解
2015/06/15 Javascript
jQuery树形下拉菜单特效代码分享
2015/08/15 Javascript
基于dropdown.js实现的两款美观大气的二级导航菜单
2015/09/02 Javascript
NodeJS创建基础应用并应用模板引擎
2016/04/12 NodeJs
全面解析多种Bootstrap图片轮播效果
2016/05/27 Javascript
jQuery的Each比JS原生for循环性能慢很多的原因
2016/07/05 Javascript
如何在JS中实现相互转换XML和JSON
2016/07/19 Javascript
HTML5+jQuery实现搜索智能匹配功能
2017/03/24 jQuery
JS实现颜色的10进制转化成rgba格式的方法
2017/09/04 Javascript
vue实现直播间点赞飘心效果的示例代码
2019/09/20 Javascript
使用 Vue-TCB 快速在 Vue 应用中接入云开发的方法
2020/02/10 Javascript
基于JavaScript获取url参数2种方法
2020/04/17 Javascript
[08:56]DOTA2-DPC中国联赛2月23日Recap集锦
2021/03/11 DOTA
python自动格式化json文件的方法
2015/03/11 Python
Python实现PS滤镜功能之波浪特效示例
2018/01/26 Python
Python中如何导入类示例详解
2019/04/17 Python
改变生活的男士内衣:SAXX Underwear
2019/08/28 全球购物
开展党的群众路线教育实践活动方案
2014/02/05 职场文书
文秘应届生求职信
2014/07/05 职场文书
做一个有道德的人活动实施方案
2014/08/23 职场文书
公司试用期员工自我评价
2014/09/17 职场文书
慰问信(范文3篇)
2019/10/23 职场文书
详解MySQL 联合查询优化机制
2021/05/10 MySQL
解析Redis Cluster原理
2021/06/21 Redis
Win11如何查看显卡型号 Win11查看显卡型号的方法
2022/08/14 数码科技