/**
* 子组件如何更改父组件的state呢?
* 父组件传递下来的props不满足要求,往往需要修改
*
*
* Author: shujun
* Date: 2020-10-25
*/ import React from 'react'; export default class Father extends React.Component{
state = {
inputValue: 'shujun',
objValue: {'name': 'jay', 'sex': 'boy'}
}; changeInputValue = (e)=> {
this.setState({inputValue: e.target.value});
} changeObjValue = (e)=> {
let objValue = this.state.objValue;
objValue.name = e.target.value;
this.setState({objValue});
} render(){
const {inputValue, objValue} = this.state;
return <div style={{width: '600px', paddingBottom: '20px', border: '1px solid red' }}>
<h3>father:</h3>
<p>
react的state是可以修改,props是不让修改的,为什么要这么做呢,还不理解 ,,ԾㅂԾ,, <br/>
但是我现在就是想要修改props, 因为这样的场景很多:父组件传递下来的props不满足要求,往往需要修改
</p>
<input value={inputValue} onChange={this.changeInputValue}/>
state: inputValue -- {inputValue} <br/> <input value={objValue.name} onChange={this.changeObjValue}/>
state: objValue -- {JSON.stringify(objValue)} <br/> <Son1 inputValue={inputValue} objValue={objValue} /> <Son2 inputValue={inputValue} objValue={objValue}
changeInputValue={this.changeInputValue} changeObjValue={this.changeObjValue} />
</div>
} } class Son1 extends React.Component {
constructor(props){
super();
this.state = {flag: true};
} changeInputProps = (e)=> {
this.props.inputValue = e.target.value;
} changeObjProps = (e)=> {
console.log(e.target.value);
let objValue = this.props.objValue;
objValue.name = e.target.value;
console.log(objValue);
this.setState({flag: true});
} render() {
const {inputValue, objValue} = this.props; return <div style={{border: '1px solid green', marginTop: '20px'}}>
<h3>Son1: </h3>
<p>
只要props是对象,不改对象指针,只修改对象里面的内容, 照样能修改props, O(∩_∩)O
<br/> 但是注意:在change props后,一定要假装在setState, 引发render
</p> <input value={inputValue} onChange={this.changeInputProps}/>
props: inputValue -- {inputValue} <br/> <input value={objValue.name} onChange={this.changeObjProps}/>
props: objValue -- {JSON.stringify(objValue)} <br/>
</div>;
}
} class Son2 extends React.Component {
changeObjProps = (e)=> {
this.props.changeObjValue(e);
} render() {
const {inputValue, objValue} = this.props; return <div style={{border: '1px solid green', marginTop: '20px'}}>
<h3>Son2: </h3>
<p>
1. 父组件传递修改方法下来,子组件中调用父组件方法,修改的实际是父组件的state <br/>
2. 父组件state修改了,
</p> <input value={inputValue} onChange={(e)=>this.props.changeInputValue(e)}/>
props: inputValue -- {inputValue} <br/> <input value={objValue.name} onChange={this.changeObjProps}/>
props: objValue -- {JSON.stringify(objValue)} <br/>
</div>;
}
}

运行效果:

完整代码:https://gitee.com/loveCode666/study_react/blob/master/src/react_grammar/special_topics/1changeProps.js

React如何修改props && 子组件调用父组件方法的更多相关文章

  1. React篇-子组件调用父组件方法,并传值

    react 中子组件调用父组件的方法,通过props: 父组件: isNote(data){} <div className="tabC01"> <FTab ta ...

  2. react typescript 子组件调用父组件

    //父组件 import * as React from 'react'import { Input } from 'antd'const Search = Input.Searchimport &q ...

  3. react 子组件调用父组件方法

    import React from 'react'import '../page1/header.css'import { Table } from 'antd'import Child from ' ...

  4. vue 子组件调用父组件的方法

    vue中 父子组件的通信: 子组件通过 props: { //子组件中写的. childMsg: { //字段名 type: Array,//类型 default: [0,0,0] //这样可以指定默 ...

  5. Vue子组件调用父组件的方法

    Vue子组件调用父组件的方法   Vue中子组件调用父组件的方法,这里有三种方法提供参考 第一种方法是直接在子组件中通过this.$parent.event来调用父组件的方法 父组件 <temp ...

  6. Vue 子组件调用父组件 $emit

    <!DOCTYPE html><html>    <head>        <meta charset="utf-8">      ...

  7. vue 子组件调用父组件的函数

    子组件调用父组件的函数,使用$emit(eventName,[...args]),触发当前实例上的事件.附加参数都会传给监听器回调. 子组件 <template> <div> ...

  8. Vue中子组件调用父组件的方法

    Vue中子组件调用父组件的方法 相关Html: <!DOCTYPE html> <html lang="en"> <head> <meta ...

  9. react 父组件调用子组件方法、子组件调用父组件方法

    我们闲话不多说,直接上代码 // 父组件 import React, {Component} from 'react'; class Parents extends Component { const ...

  10. Flutter子组件调用父组件方法修改父组件参数

    子组件调用父级组件方法的主要实现是父组件给子组件传入一个方法,然后在子组件中调用父级方法来修改父级的参数.看一下效果图 父级组件实现 在父级组件中写一个_editParentText的方法来修改组件中 ...

随机推荐

  1. docker 二进制安装

    首先所属环境为内网并且服务器拥有的开发环境不确定,需要跑当前服务所需代码,所以优先选择使用docker docker 文档地址 https://docs.docker.com 在 install 中存 ...

  2. Web Socket 长连接

    服务 package com.kinth.basic.timetask.job.donghuan.socket; import java.io.IOException; import java.net ...

  3. app内嵌H5踩坑

    内嵌的H5是用的vue2版本开发的,期间有很多的坑要踩: 1.调用app返回上一个页面不触发页面的onmouted和window.onPageShow app返回上一个页面调用的方法并不会出发vue的 ...

  4. MapReduce原理——切片代码分析

    (1)程序先找到数据存储的目录 (2)遍历目录对每个文件进行切片 (3)遍历一个文件: 获取文件大小 计算切片大小 默认情况下,切片大小等于blocksize 每次切片时都要判断剩下部分师否大于块的1 ...

  5. netmiko批量操作华为设备

    from concurrent.futures import ThreadPoolExecutorimport timeimport netmikoimport osfrom threading im ...

  6. 一个比较全的C++农历算法(转)

    这以前本是一个MFC代码,我在这个基础上修改成了标准C++的.. 即可以在VC里用,也可以在C++Builder里用..所以一并放到这里来, 希望有人喜欢..喜欢的就给点鼓励啊~~ 示例代码: 代码: ...

  7. 找vector最大最小《转载》

    定义了vector类型的数据,要找到其中的最大最小值,其实在C++中的algorithm头文件下就有直接的函数可以使用: #include <vector> #include <al ...

  8. JavaScript 时间的操作

    1. 标准日期格式 转 时间戳 第一步,设置一个标准日期,获取这个日期格式的时间戳 let timeStr = "2020-08-10 12:34:45"; let newTime ...

  9. docker学习(dockerfile打jar包为镜像)

    docker打包jar为docker镜像 1.使用Dockerfile打镜像 将spring boot应用打包成jar包放置在/app/applcation路径中 编写dockerfile文件,内容参 ...

  10. 第十章用Python获取sqlite、MySQL、Excel、csv、json中的数据

    目录 获取sqlite3中的数据 sqlite3库获取sqlite数据 pandas库获取sqlite数据 获取MySQL中的数据 pymsql库获取MySQL数据 pandas库获取mysql数据 ...