您的当前位置:首页如何在React组件“外”使用父组件的Props
广告

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

2023-11-30 来源:吉希宠物网

本文主要介绍了详解如何在React组件“外”使用父组件的Props,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望能帮助到大家。

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

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

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

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

项目结构如下:

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

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

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

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

小编还为您整理了以下内容,可能对您也有帮助:

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

本文主要介绍了详解如何在React组件“外”使用父组件的Props,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望能帮助到大家。

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

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

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

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

项目结构如下:

.

|——src

| |——lib //公用库

| |——services //抽离出的方法

| |——index.js

| └──App

| └──app.js

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

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

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

react 子组件获取父组件传来的 props 问题

平时我获取父组件 的props, 都是在子组件函数里  this.props.xxxx

父组件这样写

子组件这样写

这种情况,子组件在 componentDidMount 里面可以拿到 props,因为 父组件的值不是异步的。

然而,当父组的的值是异步,不如AJAX请求数据,子组件的componentDidMount 就获取不到 父组件的 props

父组件

子组件componentDidMount 里是拿不到 props

怎么解决这个问题呢, 这时候,componentWillReceiveProps 就显神威了,

看了生命周期,上面问题,用componentWillReceiveProps 

完美解决问题

下面介绍一个生命周期的定义:

1)componentWillMount(){}

在客户端和服务器上,在初始渲染发生之前立即调用一次 如果在这个方法中调用setState,

render()将看到更新的状态,并且只会执行一次,尽管状态改变。

2)componentDidMount(){}

 调用一次,只在客户端(不在服务器上),在初始渲染发生后立即 子组件的componentDidMount()方法在父组件的componentDidMount()方法之前被调用 setTimeout  setInterval  AJAX 在此之行,强烈建议

3)componentWillReceiveProps(nextProps){}

 在组件接收新props时调用。初始渲染不调用此方法。老的props可以用this.props  新值就用nextProps查看 在此函数中调用this.setState()不会触发附加的渲染。

4)shouldComponentUpdate(nextProps, nextState){}

 当正在接收新的道具或状态时,在渲染之前调用。 此方法必须返回falseortrue否则报错true则渲染,false则不渲染!在此声明周期中可以考虑是否需要进行渲染!避免不必要的性能浪费// 如果shouldComponentUpdate返回false,那么render()将被完全跳过,直到下一个状态改变。此外,不会调用componentWillUpdate和componentDidUpdate。 默认返回true// 如果性能是一个瓶颈,特别是有几十个或几百个组件,请使用shouldComponentUpdate来加快您的应用程序。returntrueorfalse

5) componentWillUpdate(nextProps, nextState){}

当正在接收新的props或state时立即调用。初始渲染不调用此方法// 您不能在此方法中使用this.setState()。如果您需要更新state以响应prop更改,请改用componentWillReceiveProps。

6)componentDidUpdate(nextProps, nextState){}

在组件的更新刷新到DOM后立即调用。初始渲染不调用此方法。当组件已更新时,使用此操作作为DOM操作的机会

7)componentWillUnmount(){}

 在组件从DOM卸载之前立即调用。在此方法中执行任何必要的清理,例如使计时器无效或清除在componentDidMount中创建的任何DOM元素。clearInterval or destroy

react 子组件获取父组件传来的 props 问题

平时我获取父组件 的props, 都是在子组件函数里  this.props.xxxx

父组件这样写

子组件这样写

这种情况,子组件在 componentDidMount 里面可以拿到 props,因为 父组件的值不是异步的。

然而,当父组的的值是异步,不如AJAX请求数据,子组件的componentDidMount 就获取不到 父组件的 props

父组件

子组件componentDidMount 里是拿不到 props

怎么解决这个问题呢, 这时候,componentWillReceiveProps 就显神威了,

看了生命周期,上面问题,用componentWillReceiveProps 

完美解决问题

下面介绍一个生命周期的定义:

1)componentWillMount(){}

在客户端和服务器上,在初始渲染发生之前立即调用一次 如果在这个方法中调用setState,

render()将看到更新的状态,并且只会执行一次,尽管状态改变。

2)componentDidMount(){}

 调用一次,只在客户端(不在服务器上),在初始渲染发生后立即 子组件的componentDidMount()方法在父组件的componentDidMount()方法之前被调用 setTimeout  setInterval  AJAX 在此之行,强烈建议

3)componentWillReceiveProps(nextProps){}

 在组件接收新props时调用。初始渲染不调用此方法。老的props可以用this.props  新值就用nextProps查看 在此函数中调用this.setState()不会触发附加的渲染。

4)shouldComponentUpdate(nextProps, nextState){}

 当正在接收新的道具或状态时,在渲染之前调用。 此方法必须返回falseortrue否则报错true则渲染,false则不渲染!在此声明周期中可以考虑是否需要进行渲染!避免不必要的性能浪费// 如果shouldComponentUpdate返回false,那么render()将被完全跳过,直到下一个状态改变。此外,不会调用componentWillUpdate和componentDidUpdate。 默认返回true// 如果性能是一个瓶颈,特别是有几十个或几百个组件,请使用shouldComponentUpdate来加快您的应用程序。returntrueorfalse

5) componentWillUpdate(nextProps, nextState){}

当正在接收新的props或state时立即调用。初始渲染不调用此方法// 您不能在此方法中使用this.setState()。如果您需要更新state以响应prop更改,请改用componentWillReceiveProps。

6)componentDidUpdate(nextProps, nextState){}

在组件的更新刷新到DOM后立即调用。初始渲染不调用此方法。当组件已更新时,使用此操作作为DOM操作的机会

7)componentWillUnmount(){}

 在组件从DOM卸载之前立即调用。在此方法中执行任何必要的清理,例如使计时器无效或清除在componentDidMount中创建的任何DOM元素。clearInterval or destroy

react 组件参数传值的方法有哪些?

React 组件参数传值的方法有以下几种:

1. Props:父组件向子组件传递数据,可以通过在子组件中定义 props 来接收父组件传递的数据。

2. State:组件内部的状态管理,可以在组件内部定义 state 来存储数据。

3. Context:React 提供的一种状态管理方式,可以跨组件共享数据。

4. Rex:Rex 是一种状态管理工具,可以将应用程序的状态集中管理。

react 传值有哪几种方式?

react组件传值,大概有下面几种方法:
props
context
rex
react-router 路由切换时通过url传值(少量非机密数据,其实也是props传)。

父组件通过props传递给子组件;

父组件通过props向子组件传入一个方法,子组件在通过调用该方法,将数据以参数的形式传给父组件,父组件可以在该方法中对传入的数据进行处理;

1.props.params(推荐)

当页面跳转到UserPage页面之后,取出传过来的值:

上面的方法可以传递一个或多个值,但是每个值的类型都是字符串,没法传递一个对象,如果传递的话可以将json对象转换为字符串,然后传递过去,传递过去之后再将json字符串转换为对象将数据取出来

2.query(不推荐:刷新页面参数丢失)
query方式使用很简单,类似于表单中的get方法,传递参数为明文

3.state(不推荐,刷新页面参数丢失)
state方式类似于post方式,使用方式和query类似

特别提示:
1,获取参数时要用this.props.match.params.name
2,如果在子组件里打印要记得传this.props,如下:

通过rex来传值的实现
1,我们先写一个createAction的函数

2,在recer里面:

当action触发recer时,会把action的result传给recer的params。写好这里,我们就可以在组件中传给adction params了。

先把actionCreator拿出来。
在组件的某个需要的地方,可以直接向它传我们要放进rex里的数据:

这时,我们就可以在另外一个组件中取到刚刚放进去的数据。
另外一个组件:

把rex中的params数据映射到example上。
下面,就可以用了:

react 传值有哪几种方式?

react组件传值,大概有下面几种方法:
props
context
rex
react-router 路由切换时通过url传值(少量非机密数据,其实也是props传)。

父组件通过props传递给子组件;

父组件通过props向子组件传入一个方法,子组件在通过调用该方法,将数据以参数的形式传给父组件,父组件可以在该方法中对传入的数据进行处理;

1.props.params(推荐)

当页面跳转到UserPage页面之后,取出传过来的值:

上面的方法可以传递一个或多个值,但是每个值的类型都是字符串,没法传递一个对象,如果传递的话可以将json对象转换为字符串,然后传递过去,传递过去之后再将json字符串转换为对象将数据取出来

2.query(不推荐:刷新页面参数丢失)
query方式使用很简单,类似于表单中的get方法,传递参数为明文

3.state(不推荐,刷新页面参数丢失)
state方式类似于post方式,使用方式和query类似

特别提示:
1,获取参数时要用this.props.match.params.name
2,如果在子组件里打印要记得传this.props,如下:

通过rex来传值的实现
1,我们先写一个createAction的函数

2,在recer里面:

当action触发recer时,会把action的result传给recer的params。写好这里,我们就可以在组件中传给adction params了。

先把actionCreator拿出来。
在组件的某个需要的地方,可以直接向它传我们要放进rex里的数据:

这时,我们就可以在另外一个组件中取到刚刚放进去的数据。
另外一个组件:

把rex中的params数据映射到example上。
下面,就可以用了:

关于react子组建state初始化值为父组建传来的props问题

问:React中通过props给子组件传state值时,为什么当父组件setState后props不能同步更新?而当父组件再次setState时props值却是这次修改前的state。

答:父组件传递给子组件的props发生改变,引发子组件的render,并没有执行子组件的constructor函数,子组件没有被卸载自然不会重新加载,只会重新render,而如果父组件的props传递给子组件的state,那么子组件的state只会在第一次加载的时候被赋值,后续的父组件props变化并不会被赋值到子组件的state上,还是要理解组件的声明周期函数,以及各个函数在什么时候会被调用。

子组件显示父组件穿过来的props有两种方式:

这种方式,父组件改变props后,子组件重新渲染,由于直接使用的props,所以我们不需要做什么就可以正常显示最新的props

这种方式,由于我们使用的是state,所以每当父组件每次重新传递props时,我们需要重新处理下,将props转换成自己的state,这里就用到了 componentWillReceiveProps。

关于你提到的不会二次渲染是这样的:每次子组件接收到新的props,都会重新渲染一次,除非你做了处理来阻止(比如使用:shouldComponentUpdate),但是你可以在这次渲染前,根据新的props更新state,更新state也会触发一次重新渲染,但react不会这么傻,所以只会渲染一次,这对应用的性能是有利的。

https://segmentfault.com/q/1010000008387645

https://segmentfault.com/q/1010000006019858

React传值

数据传值大概无非是这几种情况。
1.父传子
2.子传夫
3.跨层级组件传值
4.路由传值(什么情况都可以用~但是涉及一些长的或者隐私的不建议用)
我这个人对传值这块真的有时候迷迷糊糊的,所以这次刚好复习的时候整理一下传值。

这个是最简单也是最常用的传值了。
前提条件就是父组件要引用子组件!
通常是通过props和ref传值和方法
props

通过ref传值
父组件可以通过ref选择到子组件的function,如果需要子组件的值则用return

父组件通过props向子组件传入一个方法,子组件在通过调用该方法,将数据以参数的形式传给父组件,父组件通过该方法使用数据。

利用props callback通信,父组件传递一个 callback 到子组件,当事件触发时将参数放置到 callback 带回给父组件。

使用 Context作为中间载体传值。避免了在每一个层级手动的传递 props 属性,适合于多层级的时候使用
官方文档
首先:新建 Context.js

最经典的就是使用params传值 需安装react-router-dom
形式:/:xx (xx就是要传值的参数)

怎么用呢?来看以下几步。
首先
路由配置

1.js跳转
this.props.history.push('/index/mika')
2.标签跳转:
引入Link标签 import { Link } from 'react-router-dom'
使用Link标签跳转 <Link to="/index/mika">this is link</Link>
跳转页面接收值: this.props.match.params.name 其中name就是传的参数值,自己定义了什么就叫什么名字。

还有一种query传参
1.js跳转:

在要跳转的组件上绑定onClick就可以使用。query为一个对象,携带的是需要传的参数。
不需要提前引入,也不需要路由设置,正常配置就可以
跳转页面接收值: this.props.location.query

简单的说一下2个传参的区别:
1.params 传递显示参数,query传递不显示参数,query相对于params 来说较安全一点
2.params 传值页面刷新数据还在,而query传值页面刷新数据会消失。
3.params 传值只能传一个,query 可以传多个对象。

那有没有数据传参不显示、刷新地址栏数据也不会小时的方法呢?有啊!

传参的方法和query差不多,属性不一样。
不需要路由配置
1.js跳转: this.props.history.push({pathname:'/index',state:{name:'mima'}})
2.标签跳转<Link to={{path:'/index',state:{name:'mika'}}}>XX</Link>
跳转页面接收值: this.props.location.state.name

以上暂时就这些了 没包括一些传值的包,如果需要可以自己去了解

React传值

数据传值大概无非是这几种情况。
1.父传子
2.子传夫
3.跨层级组件传值
4.路由传值(什么情况都可以用~但是涉及一些长的或者隐私的不建议用)
我这个人对传值这块真的有时候迷迷糊糊的,所以这次刚好复习的时候整理一下传值。

这个是最简单也是最常用的传值了。
前提条件就是父组件要引用子组件!
通常是通过props和ref传值和方法
props

通过ref传值
父组件可以通过ref选择到子组件的function,如果需要子组件的值则用return

父组件通过props向子组件传入一个方法,子组件在通过调用该方法,将数据以参数的形式传给父组件,父组件通过该方法使用数据。

利用props callback通信,父组件传递一个 callback 到子组件,当事件触发时将参数放置到 callback 带回给父组件。

使用 Context作为中间载体传值。避免了在每一个层级手动的传递 props 属性,适合于多层级的时候使用
官方文档
首先:新建 Context.js

最经典的就是使用params传值 需安装react-router-dom
形式:/:xx (xx就是要传值的参数)

怎么用呢?来看以下几步。
首先
路由配置

1.js跳转
this.props.history.push('/index/mika')
2.标签跳转:
引入Link标签 import { Link } from 'react-router-dom'
使用Link标签跳转 <Link to="/index/mika">this is link</Link>
跳转页面接收值: this.props.match.params.name 其中name就是传的参数值,自己定义了什么就叫什么名字。

还有一种query传参
1.js跳转:

在要跳转的组件上绑定onClick就可以使用。query为一个对象,携带的是需要传的参数。
不需要提前引入,也不需要路由设置,正常配置就可以
跳转页面接收值: this.props.location.query

简单的说一下2个传参的区别:
1.params 传递显示参数,query传递不显示参数,query相对于params 来说较安全一点
2.params 传值页面刷新数据还在,而query传值页面刷新数据会消失。
3.params 传值只能传一个,query 可以传多个对象。

那有没有数据传参不显示、刷新地址栏数据也不会小时的方法呢?有啊!

传参的方法和query差不多,属性不一样。
不需要路由配置
1.js跳转: this.props.history.push({pathname:'/index',state:{name:'mima'}})
2.标签跳转<Link to={{path:'/index',state:{name:'mika'}}}>XX</Link>
跳转页面接收值: this.props.location.state.name

以上暂时就这些了 没包括一些传值的包,如果需要可以自己去了解

jsp项目和react项目怎么互通

jsp项目和react项目怎么互通方法如下

父组件 => 子组件:

Props

Instance Methods

子组件 => 父组件:

Callback Functions

Event Bubbling

兄弟组件之间:

Parent Component

不太相关的组件之间:

Context

Portals

Global Variables

Observer Pattern

Rex等

这是最常见的react组件之间传递信息的方法了吧,父组件通过props把数据传给子组件,子组件通过this.props去使用相应的数据。

吉希宠物网还为您提供以下相关内容希望对您有帮助:

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

在services中新建一个customTheme.js文件,内容如下:在index.js文件中我们可以拿到初始化SDK时传入的定制主题对象,

react 子组件获取父组件传来的 props 问题

3)componentWillReceiveProps(nextProps){}  在组件接收新props时调用。初始渲染不调用此方法。老的props可以用this.props  新值就用nextProps查看 在此函数中调用this.setState()不会触发附加的渲染。4)should...

关于react中组件通信的几种方式详解

1. 父组件向子组件通信React数据流动是单向的,父组件向子组件通信也是最常见的;父组件通过props向子组件传递需要的信息Child.jsximport React from 'react';import PropTypes from 'prop-types';export default function Child({ name }...

react 传值有哪几种方式?

react组件传值,大概有下面几种方法: props context redux react-router 路由切换时通过url传值(少量非机密数据,其实也是props传)。父组件通过props传递给子组件;父组件通过props向子组件传入一个方法,子组件...

react 组件参数传值的方法有哪些?

React 组件参数传值的方法有以下几种:1. Props:父组件向子组件传递数据,可以通过在子组件中定义 props 来接收父组件传递的数据。2. State:组件内部的状态管理,可以在组件内部定义 state 来存储数据。3. Context:React...

React中props.children和React.Children的区别?

{props.label} )} 然后是父组件,不仅需要把它所有的子组件显示出来,还需要为每个子组件赋上name属性和值://父组件用,props是指父组件的props function renderChildren(props) {//遍历所有子组件return React.Children....

关于react子组建state初始化值为父组建传来的props问题

子组件显示父组件穿过来的props有两种方式:这种方式,父组件改变props后,子组件重新渲染,由于直接使用的props,所以我们不需要做什么就可以正常显示最新的props 这种方式,由于我们使用的是state,所以每当父组件每次重新传递...

react.js 父组件ajax获取数据,通过props传递到子组件,子组件应该怎么获 ...

比如如下代码:父组件:class Father extends Component { construtor(props){ super(props);this.state={ name: 'Peter',age: '26'} } onChangeState(stateName){ this.setState(stateName)} render(){ 姓名:{this....

jsp项目和react项目怎么互通

Parent Component 不太相关的组件之间:Context Portals Global Variables Observer Pattern Redux等 这是最常见的react组件之间传递信息的方法了吧,父组件通过props把数据传给子组件,子组件通过this.props去使用相应的数据。

[React] 子组件向父组件通信:回调函数

React组件之间的是彼此独立的,组件间的数据流动是单向的,父组件向子组件通信是最常见的方法,父组件通过 props 向子组件传递需要的信息。在React中,子组件向父组件通信时,可以使用回调函数,或者自定义事件。 在简单的...

Top