组件的定义
父子、子父通讯
import React from "react"
import App from "./App"
import { createRoot } from 'react-dom/client'
const container = document.getElementById('root')
const root = createRoot(container)
root.render(<App tab="home" />)
import React from 'react'
import Header from './component/Header'
import Main from './component/Main'
import Footer from './component/Footer'
class App extends React.Component {
render() {
return (
<div>
<Header name={'react'} age={17} />
<Main mainFn={this.myFn.bind(this)} />
<Footer name={'footer react'} footerFn={this.sonFn.bind(this)} />
</div>
)
}
myFn(data) {
console.log('data', data)
}
sonFn(data) {
console.log('data-footer', data)
}
}
export default App
import React from "react"
import './Header.css'
function Header(props) {
console.log('header props', props)
return (
<div className={'header'}>Header</div>
)
}
export default Header
import React from "react"
import './Main.css'
import ReactTypes from 'prop-types'
function Main(props) {
console.log('props', props)
function btnClick() {
props.mainFn('main data')
}
return (
<div className={'main'}>
<div>Main</div>
<button onClick={btnClick}>按钮</button>
</div>
)
}
Main.defaultProps = {
name: 'main props',
age: 18
}
Main.propTypes = {
name: ReactTypes.string,
age: ReactTypes.number
}
export default Main
import React from "react"
import './Footer.css'
import ReactTypes from "prop-types"
class Footer extends React.Component {
constructor (props) {
super(props)
console.log('footer props', props)
console.log('footer this.props', this.props)
}
render() {
return (
<div className={'footer'}>
<div>Footer</div>
<button onClick={this.clickBtn.bind(this)}>footer-click</button>
</div>
)
}
static defaultProps = {
name: 'Footer react 类组件',
age: 16
}
static propTypes = {
name: ReactTypes.string,
age: ReactTypes.number
}
clickBtn() {
console.log('this.props', this.props)
this.props.footerFn('footer data')
}
}
export default Footer
跨组件通讯
import React from 'react';
class Son extends React.Component{
constructor(props){
super(props);
}
render(){
return (
<div>
<p>我是儿子</p>
<p>{this.props.name}</p>
<button onClick={()=>{this.btnClick()}}>儿子按钮</button>
</div>
)
}
btnClick(){
this.props.appFn(18);
}
}
class Father extends React.Component{
constructor(props){
super(props);
}
render(){
return (
<div>
<p>我是爸爸</p>
<Son name={this.props.name} appFn={this.props.appFn}/>
</div>
)
}
}
class App extends React.Component{
render(){
return (
<div>
<Father name={'lnj'} appFn={this.myFn.bind(this)}/>
</div>
)
}
myFn(age){
console.log(age);
}
}
export default App;
import React from 'react';
class A extends React.Component{
constructor(props){
super(props);
}
render(){
return (
<div>
<button onClick={()=>{this.btnClick()}}>A按钮</button>
</div>
)
}
btnClick(){
this.props.appFn('lnj');
}
}
class B extends React.Component{
constructor(props){
super(props);
}
render(){
return (
<div>
<p>{this.props.name}</p>
</div>
)
}
}
class App extends React.Component{
constructor(props){
super(props);
this.state = {
name:''
}
}
render(){
return (
<div>
<A appFn={this.myFn.bind(this)}/>
<B name={this.state.name}/>
</div>
)
}
myFn(name){
this.setState({
name: name
})
}
}
export default App;
context
import React from 'react'
const AppContext = React.createContext({})
const { Provider, Consumer } = AppContext
class Son extends React.Component {
render() {
return (
<Consumer>
{
(value) => {
return (
<div>
<p>{value.name}</p>
<p>{value.age}</p>
</div>
)
}
}
</Consumer>
)
}
}
class Father extends React.Component {
render() {
return (
<div>
<Son></Son>
</div>
)
}
}
class App extends React.Component {
render() {
return (
<Provider value={{ name: 'lnj', age: 18 }}>
<Father></Father>
</Provider>
)
}
}
export default App
import React from 'react'
const AppContext = React.createContext({
name: 'from context',
sex: 'female',
age: 18
})
class Son extends React.Component {
render() {
return (
<div>
{/* 3.从当前组件的上下文中消费数据 */}
<div>{this.context.age}</div>
</div>
)
}
}
Son.contextType = AppContext
class Father extends React.Component {
render() {
return (
<div>
<div>{this.context.name}</div>
<Son></Son>
</div>
)
}
}
Father.contextType = AppContext
class App extends React.Component {
render() {
return (
<div>
<Father></Father>
</div>
)
}
myFn(data) {
console.log('data', data)
}
sonFn(data) {
console.log('data-footer', data)
}
}
export default App
import React from 'react';
const AppContext1 = React.createContext({});
const AppContext2 = React.createContext({});
class Son extends React.Component{
render(){
return (
<AppContext1.Consumer>
{
(value)=>{
return (
<AppContext2.Consumer>
{
(value2)=>{
return (
<div>
<p>{value.name}</p>
<p>{value.age}</p>
<p>{value2.gender}</p>
</div>
)
}
}
</AppContext2.Consumer>
)
}
}
</AppContext1.Consumer>
)
}
}
class Father extends React.Component{
render(){
return (
<div>
<Son></Son>
</div>
)
}
}
class App extends React.Component{
render(){
return (
<AppContext1.Provider value={{name:'lnj', age:18}}>
<AppContext2.Provider value={{gender:'man'}}>
<Father></Father>
</AppContext2.Provider>
</AppContext1.Provider>
)
}
}
export default App;
event
import React from 'react';
import {EventEmitter} from 'events';
const eventBus = new EventEmitter();
class Son extends React.Component{
render(){
return (
<div>
<p>son</p>
<button onClick={()=>{this.btnClick()}}>按钮</button>
</div>
)
}
btnClick(){
eventBus.emit('say', 'lnj', 18);
}
}
class Father extends React.Component{
render(){
return (
<div>
<Son/>
</div>
)
}
}
class App extends React.Component{
componentDidMount() {
eventBus.addListener('say', this.appFn.bind(this));
}
componentWillUnmount() {
eventBus.removeListener('say', this.appFn.bind(this));
}
appFn(name, age){
console.log(name, age);
}
render(){
return (
<div>
<Father/>
</div>
)
}
}
export default App;
state合并问题
import React from "react"
class Home extends React.Component {
constructor () {
super()
this.state = {
num: 1
}
}
render() {
return (
<div>
<div>{this.state.num}</div>
<button onClick={() => this.changeNum()}>按钮</button>
</div>
)
}
changeNum() {
this.setState({
num: this.state.num + 1
})
this.setState({
num: this.state.num + 1
})
this.setState({
num: this.state.num + 1
})
}
}
class App extends React.Component {
constructor () {
super()
this.state = {
num: 1
}
}
render() {
return (
<div>
<Home />
</div>
)
}
}
export default App
let oldObj = {age: 0};
let stateList = [
{age: 1},
{age: 1},
{age: 1}
];
stateList.forEach((newObj)=>{
oldObj = Object.assign({}, oldObj, newObj);
});
console.log(oldObj);
changeNum() {
this.setState((preState, props) => {
return { num: preState.num + 1 }
})
this.setState((preState, props) => {
return { num: preState.num + 1 }
})
this.setState((preState, props) => {
return { num: preState.num + 1 }
})
}
let oldObj = {age: 0};
let stateList = [
(preState)=>{return {age: preState.age + 1}},
(preState)=>{return {age: preState.age + 1}},
(preState)=>{return {age: preState.age + 1}},
];
stateList.forEach((fn)=>{
let newObj = fn(oldObj);
oldObj = Object.assign({}, oldObj, newObj);
});
console.log(oldObj);