react 组件传参+生命周期+hooks:useState,useEffect

一 组件传参

父传子与子传父

  1. 父组件

import ChildA from "./components/ChildA";
import React, { Component } from 'react';

class App extends Component {
  state = { num:5 } 
  // 定义一个修改num的方法
  setNum=v=>this.setState({num:v})
  render() { 
    return (<div>
      <h2>组件传参</h2>
      <p>App的num值:{this.state.num}</p>
      {/* react 父传子用props */}
      {/* 把函数当做props传递给子组件 */}
      <ChildA
      setNum={this.setNum} 
      value={this.state.num}></ChildA>
      <ChildA></ChildA>
      </div>);
  }
}
 
 

export default App;

// 爷父孙  爷孙传参 用 context
// 一个简单的React Context传参案例可以是这样:

// //Context 对象
// const MyContext = React.createContext();

// //父组件
// class Parent extends React.Component{
//   state = {
//     message: "Hello World"
//   }
//   render(){
//     //把状态传递给Context对象 
//     return 
//      <MyContext.Provider value={this.state.message}>
//        <Child />
//      </MyContext.Provider>
//   }
// }

// //子组件
// class Child extends React.Component{
//   render(){
//     //从Context对象中获取参数 
//     return 
//       <MyContext.Consumer>
//         {message => <p>{message}</p>}
//       </MyContext.Consumer>
//   }
// }

子组件

function ChildA(props) {
  return ( <div>
    <p>childA子组件props参数:{props.value}</p>
    {/* 子向父传参是通过props的回调函数实现 */}
    <button onClick={()=>{props.setNum(100)}}>修改父组件的num值为100</button>
    </div> );
}

export default ChildA;

// 定义默认参数
ChildA.defaultProps = {value:1}

2组件插槽

父组件

import ChildA from './components/ChildA'

import React, { Component } from 'react';

class App extends Component {
  state = {  }
  render() { 
    return ( <div>
      <h2> 组件的插槽</h2>
    
      <ChildA>
        学号前端
      </ChildA>
  
    </div> );
  }
}
 

export default App

子组件

import React, { Component } from 'react';

class ChildB extends Component {
    constructor(props) {
        super(props);
    this.state = {  }

    }
    render() { 
        return ( <div>
            ChildB:通过props。children获取插槽的内容\
            <br/>
            {this.props.children}
        </div>);
    }
}
 
export default ChildB;

生命周期

import React, { PureComponent } from 'react';
class ChildC extends PureComponent {
  constructor(props) {
    super(props);
    this.state = { num:5 }
    // console.log("挂载:01 constructor")
  }
  static getDerivedStateFromProps(nextProps, prevState) {
    // console.log("挂载:02 getDerivedStateFromProps")
    // console.log("更新:01 getDerivedStateFromProps")
    return {}
  }
  // shouldComponentUpdate(nextProps, nextState) {
  //   // console.log("更新:02  shouldComponentUpdate")
  //   // return true
  //   // 如果发现props相同就不更新返回false否则返回true
  //   if(this.props.value===nextProps.value){
  //     return false;
  //   }else{
  //     return true;
  //   }
  // }
 
  render() { 
    var num = this.state.num;
    // console.log("挂载:03 render")
    // console.log("更新:03 render")
    console.log("render")
    return ( <div>
    <h3>组件的生命周期ChildC</h3>
    <p>子组件接收value{this.props.value}</p>
    <button onClick={()=>this.setState({num:num+1})}>{num}</button>
    </div> );
  }
  componentDidMount() {
    // console.log("挂载:04 componentDidMount")
  }
  getSnapshotBeforeUpdate(prevProps, prevState) {
    // console.log("更新:04 getSnapshotBeforeUpdate")
    // 更新前获取快照,返回的的值下个cdu的第三个参数
    return {name:"mumu",age:19}
  }
  componentDidUpdate(prevProps, prevState,snap) {
    // console.log("更新:05 componentDidUpdate",snap)
  }
  componentWillUnmount(){
    // console.log("卸载:01 componentWilUnmount")
  }
}
 
export default ChildC;

// react的生命周期三个阶段
// 卸载阶段
// 01 componetWillUnmount组件将要卸载
// 更新阶段
// 01 static getDerivedStateFromProps
// 02 sholdComponentUpdate 返回true执行渲染,返回false不渲染(优化)
// 03 render 渲染
// 04 getSnapshotBeforeUpdate 更新前获取快照
// 05 componentDidUpdate 组件已经更新
// 挂载阶段
// 01 构造函数
// 02 static getDerivedStateFromProps 
//    props,state更新会执行
// 03 render  函数
// 04 componentDidMount 组件已经挂载
//    事件监听,dom操作,ajax,定时器

hooks:useState useEffect

import {useState,useEffect} from  'react'
// 使用useState模拟状态 useEffect模式生命周期
function fetchData(page=1){
  return fetch("http://dida100.com/mi/list.php?page="+page)
  .then(res=>res.json())
}
function App() {
  // 定义count数据,和设置Count的方法,默认count的值为5
  // count名字,setCount是自己随意定的后面是方法前面是数据
  const[count,setCount] = useState(5)
  // list笑话列表数,setList设置笑话列表数据。默认类别值为空
  const[list,setList] = useState([])
  useEffect(()=>{
    // console.log("组件已经挂载完毕:ajax,dom操作,定时器,事件挂载")
   fetchData()
   .then(res=>{
    setList(res.result)    
   })
  },[])
  // 模拟count,list的更新
  // useEffect(()=>{
  //   console.log("count已经更新")
  // },[count,list])
  useEffect(()=>{
    console.log("任意数据的更新")
  })
  

  return ( <div>
    <h3>函数组件;无状态组件</h3>
    <button onClick={()=>setCount(count+2)}>{count}</button>
    {
      // docid与summary来自数据的字段
      list.map(item=><p key={item.docid}>{item.summary}</p>)
    }
  </div> );
}

export default App;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值