react组件之间通信(React传递参数的几种方式)
react组件之间通信
React传递参数的几种方式目录
- 父子组件之间传递参数
- 路由传参
- 状态提升
- context
- 引入redux
父组件往子组件传值,直接用this.props就可以实现
在父组件中,给需要传递数据的子组件添加一个自定义属性,在子组件中通过this.props就可以获取到父组件传递过去的数据
// 父组件 render() { return ( // 使用自定义属性传递需要传递的方法或者参数 <ShopUi toson={this.state}></ShopUi> ) } //子组件 //通过this.props.toson就可以获取到父组件传递过来的数据
如果还需要往孙组件传递那么在子组件通过自定义属性继续传递就行了
tograndson={this.props.toson}
孙组件通过this.props.tograndson获取到数据
子组件给父组件传值的话,需要在父组件设置接收函数和state,同时将函数名通过props传递给子组件
也就是给子组件传入父组件的方法,在子组件进行调用
//孙子组件 export default class Grandson extends Component{ render(){ return ( <li style={{border: "1px solid red",margin: "10px"}}> {this.props.name}: <select onChange={this.props.handleSelect}> <option value="男">男</option> <option value="女">女</option> </select> </li> ) } }; //子组件 export default class Child extends Component{ render(){ return ( <li style={{border: "1px solid green",margin: "10px"}}> {this.props.name}:<input onChange={this.props.handleVal}/> <Grandson name="性别" handleSelect={this.props.handleSelect}/> </li> ) } }; //父组件 export default class Parent extends Component{ constructor(props){ super(props) this.state={ username: '', sex: '' } }, handleVal(event){ this.setState({username: event.target.value}); }, handleSelect(value) { this.setState({sex: event.target.value}); }, render(){ return ( <li style={{border: "1px solid #000",padding: "10px"}}> <li>用户姓名:{this.state.username}</li> <li>用户性别:{this.state.sex}</li> <Child name="姓名" handleVal={this.handleVal} handleSelect={this.handleSelect}/> </li> ) } }
前一段时间有人问过我这样一个问题,constructor里面的super()是干嘛用的?
总结一下:
如果要在子类的constructor里使用this,必须调用父类constructor,否则就拿不到this
那么问题就来了,如何调用父类的constructor呢? 通过super()
如果要在constructor里使用父组件传递过来的参数,必须在调用父组件super时,传递参数给父组件的constructor
如果不在constructor里面使用this,或者参数,就不需要super ; 因为React以及帮你做了this,props的绑定
路由传参安装 npm install react-router-dom --save-dev
定义路由(一般会放在外面)
<HashRouter> <Switch> <Route exact path="/" component={Home}/> <Route exact path="/detail" component={Detail}/> </Switch> </HashRouter>
当页面跳转时
<li onClick={el => this.props.history.push({ pathname:'/detail', state:{id:3} })} > </li>
接收 通过this.props.history.location可以获取到传递过来的数据
路由传参可能会有这个问题,就是只有在路由定义时挂载的组件中才会有props里面的location history match
路由上挂载的那个组件一般都是Container.js,一般我们会往下分出UI.js组件,在这里面进行点击跳转,UI组件props里没有location history match
需要用到高阶组件withRouter
状态提升将多个组件需要共享的状态提升到离他们最近的那个公共父组件上,然后父组件通过props分发给子组件
context当某个组件在自己的context中保存了某个状态,那个该组件下的所有子孙组件都可以访问到这个状态,不需要中间组件的传递,而这个组件的父组件是没办法访问的
class Index extends Component { static childContextTypes = { themeColor: PropTypes.string } constructor () { super() this.state = { themeColor: 'red' } } getChildContext () { return { themeColor: this.state.themeColor } } render () { return ( <li> <Header /> <Main /> </li> ) } }
通过getChildContext()将属性传递给所有的子孙组件
提供 context 的组件必须提供 childContextTypes 作为 context 的声明和验证。
class Title extends Component { static contextTypes = { themeColor: PropTypes.string } render () { return ( <h1 style={{ color: this.context.themeColor }}>标题</h1> ) } }
子组件要获取 context 里面的内容的话,就必须写 contextTypes 来声明和验证你需要获取的状态的类型,它也是必写的,如果你不写就无法获取 context 里面的状态。
Title 想获取 themeColor,它是一个字符串,我们就在 contextTypes 里面进行声明。
redux为React提供可预测化的状态管理机制
redux将整个应用状态存储到store,store里保存着一个state状态树
组件可以派发(dispatch) 行为 (action) 给store , 而不是直接通知其它组件
其它组件可以通过订阅store中的状态state来刷新自己的视图
到此这篇关于React传递参数的几种方式的文章就介绍到这了,更多相关React传递参数内容请搜索开心学习网以前的文章或继续浏览下面的相关文章希望大家以后多多支持开心学习网!
- react怎样实现响应式计算属性(深入浅析React中diff算法)
- linux虚拟内存实现需要哪六种机制(解析Linux高性能网络IO和Reactor模型)
- yii2对比springboot(yii2.0框架使用 beforeAction 防非法登陆的方法分析)
- react app框架(浅谈React原生APP更新)
- react怎么绑定state(react纯函数组件setState更新页面不刷新的解决)
- react循环有几种方法(React forwardRef的使用方法及注意点)
- react基础知识入门(浅谈React 的引入)
- html5创作(HTML5录音实践总结Preact)
- react动态添加组件属性(react使用antd的上传组件实现文件表单一起提交功能完整代码)
- reacthooks基础使用(React 小技巧教你如何摆脱hooks依赖烦恼)
- react native web白屏(关于React Native 无法链接模拟器的问题)
- reactnative示例代码(React Native项目框架搭建的一些心得体会)
- react执行流程(React开启代理的2种实用方式)
- vue3.0 如何使用useroute(详解vue3中setUp和reactive函数的用法)
- react usestate实现原理(浅谈react useEffect闭包的坑)
- react native常用组件(react native环境安装流程)
- 鱼竿 夏钓短,冬钓长 ,一定是这样 认清优缺点在选竿(鱼竿夏钓短冬钓长)
- 鲢鳙钓底还是钓浮 流水的水域应怎样做钓(鲢鳙钓底还是钓浮)
- 入秋后的第二场苹果发布会来了 全新M1系列芯片登场(入秋后的第二场苹果发布会来了)
- 苹果正式发布自研芯片M1 5nm 32核心 彻底放弃Intel(苹果正式发布自研芯片M1)
- 苹果自研芯片跑分对比 A16芯片排名靠后,M1系列霸榜(苹果自研芯片跑分对比)
- X86处理器的梦魇 苹果M1自研芯片到底有多强(苹果M1自研芯片到底有多强)
热门推荐
- css代码使用方法(写出牛逼的CSS代码13条建议你会哪几条)
- mysqlsql按日期统计(sqlserver/mysql按天、按小时、按分钟统计连续时间段数据推荐)
- 百度网和阿里云哪个好用(百度云服务器bcc有什么优势?)
- php连接oracle(PHP远程连接oracle数据库操作实现方法图文详解)
- php 记录的已读状态(PHP使用观察者模式处理异常信息的方法详解)
- 谷歌gcp云认证考试(谷歌云gcp开启ssh访问并设置密码)
- vue渲染数据的过程(Vue前端高效开发之列表渲染指令)
- dockerswarm网络架构(docker swarm外部验证负载均衡时不生效的解决方案)
- 云主机免费体验(免费云主机试用一年靠谱吗)
- Chrome谷歌浏览器开发者工具中Profiles的使用
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9