门户网站平台建设情况,北碚区网站建设,大连建网站公司,建设通app1.组件的定义方式
函数组件Functional Component类组件Class Component
2.类组件
export class Profile extends Component {render() {console.log(this.context);return (divProfile/div)}
}
组件的名称是大写字符开头#xff08;无论类组件还是函数组件…1.组件的定义方式
函数组件Functional Component类组件Class Component
2.类组件
export class Profile extends Component {render() {console.log(this.context);return (divProfile/div)}
}
组件的名称是大写字符开头无论类组件还是函数组件类组件需要继承自 React.Component类组件必须实现render函数constructor是可选的我们通常在constructor中初始化一些数据
render函数的返回值
当 render 被调用时它会检查 this.props 和 this.state 的变化并返回以下类型之一:
React 元素通常通过 JSX 创建数组或 fragments使得 render 方法可以返回多个元素Portals可以渲染子节点到不同的 DOM 子树中字符串或数值类型它们在 DOM 中会被渲染为文本节点布尔类型或 null什么都不渲染
3.函数组件
函数组件是使用function来进行定义的函数只是这个函数会返回和类组件中render函数返回一样的内容。
函数组件有自己的特点:
没有生命周期也会被更新并挂载但是没有生命周期函数this关键字不能指向组件实例因为没有组件实例没有内部状态state 4.生命周期
React内部为了告诉我们当前处于哪些阶段会对我们组件内部实现的某些函数进行回调这些函数就是生命周期函数
实现componentDidMount函数组件已经挂载到DOM上时就会回调实现componentDidUpdate函数组件已经发生了更新时就会回调实现componentWillUnmount函数组件即将被移除时就会回调
不常用的生命周期
getDerivedStateFromPropsstate 的值在任何时候都依赖于 props时使用该方法返回一个对象来更新stategetSnapshotBeforeUpdate在React更新DOM之前回调的一个函数可以获取DOM更新前的一些信息比如说滚动位置shouldComponentUpdate可进行state、props、context进行新旧对比返回true或false进行是否更新组件
5.组件之间的通信
父组件通过 属性值 的形式来传递给子组件数据子组件通过 props 参数获取父组件传递过来的数据
父组件
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.statereturn (divTabControl 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 */}{/* NavBarbutton左边/buttonh2中间部分/h2button右边/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.cssexport class index extends Component {constructor() {super()this.state {curIndex: 0}}changeCurIndex(index) {this.setState({curIndex: index})this.props.changeTab(index)}render() {const {titles} this.propsconst {curIndex} this.statereturn (divdiv classNametab-control{titles.map((item, index) {return (div className{item ${index curIndex ? active:}} key{item} onClick{e this.changeCurIndex(index)}span classNametext{item}/span/div)})}/div/div)}
}export default index
6.React中实现插槽
React对于这种需要插槽的情况非常灵活有两种方案可以实现
组件的children子元素props属性传递React元素
方式一 import React, { Component } from react
import ./style.cssexport class index extends Component {render() {const {children} this.propsreturn (div classNamenav-bardiv classNameleft{children[0]}/divdiv classNamecenter{children[1]}/divdiv classNameright{children[2]}/div/div)}
}// index.propTypes {
// children: PropTypes.element
// }export default index
方式二 import React, { Component } from react
import ./style.cssexport class index extends Component {render() {const {leftSlot, centerSlot, rightSlot} this.propsreturn (div classNamenav-bardiv classNameleft{leftSlot}/divdiv classNamecenter{centerSlot}/divdiv classNameright{rightSlot}/div/div)}
}// index.propTypes {
// children: PropTypes.element
// }export default index
7.context应用场景
非父子组件数据的共享
对于有一些场景比如一些数据需要在多个组件中进行共享地区偏好、UI主题、用户登录状态、用户信息等
React提供了一个APIContextContext 提供了一种在组件之间共享此类值的方式而不必显式地通过组件树的逐层传递 propsContext 设计目的是为了共享那些对于一个组件树而言是“全局”的数据例如当前认证的用户、主题或首选语言
Context相关API
React.createContext 创建一个需要共享的Context对象 如果一个组件订阅了Context那么这个组件会从离自身最近的那个匹配的 Provider 中读取到当前的context值defaultValue是组件在顶层查找过程中没有找到对应的Provider那么就使用默认值 Context.Provider
每个 Context 对象都会返回一个 Provider React 组件它允许消费组件订阅 context 的变化Provider 接收一个 value 属性传递给消费组件一个 Provider 可以和多个消费组件有对应关系多个 Provider 也可以嵌套使用里层的会覆盖外层的数据当 Provider 的 value 值发生变化时它内部的所有消费组件都会重新渲染 创建context
import React from react;const ThemeContext React.createContext({nickname: curry, work: 前端})export default ThemeContextimport 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/Profileexport class AppHome extends Component {render() {return (divAppUserContext.Provider value{{name: hgf, age: 23}}ThemeContext.Provider value{{color: red, size: 30px}}Home //ThemeContext.Provider/UserContext.ProviderProfile //div)}
}export default AppHome
获取和使用方式
import React, { Component } from react
import ThemeContext from ./theme-contextexport class Profile extends Component {render() {console.log(this.context);return (divProfile/div)}
}Profile.contextType ThemeContextexport 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 (divHomeInfoUserContext.Consumer{value {return h2InfoUser: {value.age}/h2}}/UserContext.Consumer/div)}
}HomeInfo.contextType ThemeContextexport default HomeInfo