详解如何在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 相关文章推荐
js中符号转意问题示例探讨
Aug 19 Javascript
js控制input输入字符解析
Dec 27 Javascript
Javascript学习笔记之 对象篇(四) : for in 循环
Jun 24 Javascript
Document.body.scrollTop的值总为零的快速解决办法
Jun 09 Javascript
JavaScript代码里的判断小结
Aug 22 Javascript
详解XMLHttpRequest(一)同步请求和异步请求
Sep 14 Javascript
JavaScript通过改变文字透明度实现的文字闪烁效果实例
Apr 27 Javascript
微信小程序 http请求的session管理
Jun 07 Javascript
JavaScript设计模式之单例模式详解
Jun 09 Javascript
微信小程序实现拖拽 image 触摸事件监听的实例
Aug 17 Javascript
对angular2中的ngfor和ngif指令嵌套实例讲解
Sep 12 Javascript
详解vue中async-await的使用误区
Dec 05 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自定义加密与解密程序实例
2014/12/31 PHP
php使用glob函数遍历文件和目录详解
2016/09/23 PHP
laravel-admin自动生成模块,及相关基础配置方法
2019/10/08 PHP
浅谈Laravel中的三种中间件的作用
2019/10/13 PHP
Prototype 学习 工具函数学习($方法)
2009/07/12 Javascript
javascript学习笔记(一)基础知识
2014/09/30 Javascript
jQuery 实现侧边浮动导航菜单效果
2014/12/26 Javascript
在JavaScript的AngularJS库中进行单元测试的方法
2015/06/23 Javascript
原生JavaScript实现瀑布流布局
2020/06/28 Javascript
详解Vue-Cli 异步加载数据的一些注意点
2017/08/12 Javascript
详解react服务端渲染(同构)的方法
2017/09/21 Javascript
Vue中对比scoped css和css module的区别
2018/05/17 Javascript
BootStrap模态框闪退问题实例代码详解
2018/12/10 Javascript
为vue项目自动设置请求状态的配置方法
2019/06/09 Javascript
JavaScript获取当前url路径过程解析
2019/12/27 Javascript
理解Python中的With语句
2015/02/02 Python
python实现字符串和日期相互转换的方法
2015/05/13 Python
在Django框架中编写Contact表单的教程
2015/07/17 Python
轻量级的Web框架Flask 中模块化应用的实现
2017/09/11 Python
Python 3.3实现计算两个日期间隔秒数/天数的方法示例
2019/01/07 Python
Python单元测试工具doctest和unittest使用解析
2019/09/02 Python
如何基于python实现不邻接植花
2020/05/01 Python
python如何控制进程或者线程的个数
2020/10/16 Python
详解Python中openpyxl模块基本用法
2021/02/23 Python
美国设计师精美珠宝购物网:Netaya
2016/08/28 全球购物
贝尔帐篷精品店:Bell Tent Boutique
2019/06/12 全球购物
马来西亚网上花店:FlowerAdvisor马来西亚
2020/01/03 全球购物
公司成立感言
2014/01/11 职场文书
新春文艺演出主持词
2014/03/27 职场文书
计算机多媒体专业自荐信
2014/07/04 职场文书
领导干部遵守党的政治纪律情况思想汇报
2014/09/14 职场文书
群众路线教育实践活动批评与自我批评
2014/09/15 职场文书
整改落实自查报告
2014/11/05 职场文书
合伙经营协议书范本(通用版)
2014/12/03 职场文书
常务副总经理岗位职责
2015/02/02 职场文书
2016年秋季运动会加油稿
2015/12/21 职场文书