- export class Profile extends Component {
- render() {
- console.log(this.context);
- return (
- <div>Profilediv>
- )
- }
- }
当 render 被调用时,它会检查 this.props 和 this.state 的变化并返回以下类型之一:
函数组件是使用function来进行定义的函数,只是这个函数会返回和类组件中render函数返回一样的内容。
函数组件有自己的特点:

React内部为了告诉我们当前处于哪些阶段,会对我们组件内部实现的某些函数进行回调,这些函数就是生命周期函数:
父组件:
- import React from "react"
- // import HelloWorld from "./Components/HelloWorld"
- import TabControl from './Components/父子组件通信案例'
- // import NavBar from './Components/实现插槽一'
- // import NavBar from './Components/实现插槽二'
- // import TabControl from './Components/作用域插槽'
- // import AppHome from "./Components/非父子组件通信-context/AppHome";
-
- class App extends React.Component {
- constructor() {
- super()
- console.log("hello react");
- this.state = {
- message: "hello react",
- isShow: true,
- titles: ['流行', '新款', '精选'],
- curIndex: 0
- }
- }
- changeText() {
- this.setState({
- message: 'hello hgf'
- })
- }
- switchText() {
- this.setState({
- isShow: !this.state.isShow
- })
- }
-
- switchTab(curIndex){
- this.setState({curIndex})
- }
-
- render() {
- const { titles, curIndex } = this.state
- return (
- <div>
- <TabControl titles={titles} changeTab={(curIndex) => this.switchTab(curIndex)} />
- {/* <h2>{titles[curIndex]}h2> */}
- {/* <h2>{message}h2> */}
- {/* <button onClick={e => this.switchText()}>切换button> */}
- {/* {isShow && <HelloWorld/>} */}
- {/* <button onClick={e => this.changeText()}>修改文本button> */}
- {/* 插槽实现1 */}
- {/* <NavBar>
- <button>左边button>
- <h2>中间部分h2>
- <button>右边button>
- NavBar> */}
- {/* 插槽实现二 */}
- {/* <NavBar leftSlot={<button>左按钮button>} centerSlot={<h2>插槽实现二h2>} rightSlot={<button>右按钮button>} /> */}
- {/* 作用域插槽 */}
- {/* <TabControl titles={titles} itemTypes={(item) => <button>{item}button>} changeTab={(curIndex) => this.switchTab(curIndex)} />
- <h2>{titles[curIndex]}h2> */}
- {/* 非父子组件通信 */}
- {/* <AppHome /> */}
- div>
- )
- }
-
- componentDidMount() {
- console.log("component Mount")
- }
-
- componentDidUpdate() {
- console.log("component Update");
- }
- }
-
- export default App
子组件:
- import React, { Component } from 'react'
- import "./tab-control.css"
-
- export class index extends Component {
- constructor() {
- super()
- this.state = {
- curIndex: 0
- }
- }
- changeCurIndex(index) {
- this.setState({curIndex: index})
- this.props.changeTab(index)
- }
- render() {
- const {titles} = this.props
- const {curIndex} = this.state
- return (
- <div>
- <div className='tab-control'>
- {
- titles.map((item, index) => {
- return (
- <div className={`item ${index === curIndex ? 'active':''}`} key={item} onClick={e => this.changeCurIndex(index)}>
- <span className='text'>{item}span>
- div>
- )
- })
- }
- div>
-
- div>
- )
- }
- }
-
- export default index
React对于这种需要插槽的情况非常灵活,有两种方案可以实现:

- import React, { Component } from 'react'
- import "./style.css"
-
- export class index extends Component {
- render() {
- const {children} = this.props
-
- return (
- <div className='nav-bar'>
- <div className='left'>
- {children[0]}
- div>
- <div className='center'>
- {children[1]}
- div>
- <div className='right'>
- {children[2]}
- div>
- div>
- )
- }
- }
-
- // index.propTypes = {
- // children: PropTypes.element
- // }
-
- export default index

- import React, { Component } from 'react'
- import "./style.css"
-
- export class index extends Component {
- render() {
- const {leftSlot, centerSlot, rightSlot} = this.props
-
- return (
- <div className='nav-bar'>
- <div className='left'>
- {leftSlot}
- div>
- <div className='center'>
- {centerSlot}
- div>
- <div className='right'>
- {rightSlot}
- div>
- div>
- )
- }
- }
-
- // index.propTypes = {
- // children: PropTypes.element
- // }
-
- export default index
对于有一些场景:比如一些数据需要在多个组件中进行共享(地区偏好、UI主题、用户登录状态、用户信息等)
创建一个需要共享的Context对象
![]()
![]()
- import React from "react";
-
- const ThemeContext = React.createContext({nickname: 'curry', work: '前端'})
-
- export default ThemeContext
- import React from "react";
-
- const UserContext = React.createContext()
-
- export default UserContext
- import React, { Component } from 'react'
- import ThemeContext from './context/theme-context'
- import UserContext from './context/user-context'
- import Home from './context/Home'
- import Profile from './context/Profile'
-
- export class AppHome extends Component {
- render() {
- return (
- <div>
- App
- <UserContext.Provider value={{name: 'hgf', age: 23}}>
- <ThemeContext.Provider value={{color: 'red', size: '30px'}}>
- <Home />
- ThemeContext.Provider>
- UserContext.Provider>
- <Profile />
- div>
- )
- }
- }
-
- export default AppHome
- import React, { Component } from 'react'
- import ThemeContext from './theme-context'
-
- export class Profile extends Component {
- render() {
- console.log(this.context);
- return (
- <div>Profilediv>
- )
- }
- }
-
- Profile.contextType = ThemeContext
-
- export default Profile
- import React, { Component } from 'react'
- import ThemeContext from './theme-context';
- import UserContext from './user-context';
-
- export class HomeInfo extends Component {
- render() {
- console.log(this.context);
- return (
- <div>
- HomeInfo
- <UserContext.Consumer>
- {
- value => {
- return <h2>InfoUser: {value.age}h2>
- }
- }
- UserContext.Consumer>
- div>
- )
- }
- }
-
- HomeInfo.contextType = ThemeContext
-
- export default HomeInfo