赞
踩
目录
1 当组件标签有子节点时,props就会有children属性,children属性的值就是子节点的内容
2 children属性与普通的props一样,值可以是任意值(文本、react元素、组件、函数..)
- import React from "react";
- import ReactDOM from "react-dom";
-
-
- class App extends React.Component {
-
- render() {
- return (
- <div>
- <h1> 123</h1>
- {this.props.children}
- </div>
- )
- }
- }
-
-
- ReactDOM.render(<App>子节点</App>, document.getElementById("root"));
效果
相当于这样
JXL作为子节点
- import React from "react";
- import ReactDOM from "react-dom";
-
-
- class App extends React.Component {
-
- render() {
- return (
- <div>
- <h1> 123</h1>
- {this.props.children}
- </div>
- )
- }
- }
-
- //JXL作为子节点
- ReactDOM.render(<App><p>我是子节点:p标签</p></App>, document.getElementById("root"));
子节点也可以是一个组件
- import React from "react";
- import ReactDOM from "react-dom";
-
-
- class App extends React.Component {
-
- render() {
- return (
- <div>
- <h1> 123</h1>
- {this.props.children}
- </div>
- )
- }
- }
-
- class Test extends React.Component {
-
- render() {
- return (
- <button>我是button</button>
- )
- }
- }
-
- //子节点也可以是一个组件
- ReactDOM.render(<App><Test/></App>, document.getElementById("root"));
效果
子节点也可以是一个函数
- import React from "react";
- import ReactDOM from "react-dom";
-
-
- class App extends React.Component {
-
- render() {
- this.props.children()
- return (
- <div>
- <h1> 123</h1>
- </div>
- )
- }
- }
-
-
- //子节点也可以是一个函数
- ReactDOM.render(<App>{()=>alert("这是一个函数子节点")}</App>, document.getElementById("root"));
效果
问题: 组件的创建者和使用者不是同一个人,如果传入的数据格式不对, 可能会导致组件内部报错,组件的使用者不知道明确的错误原因
解决办法: 使用props校验 → 允许在创建组件的时候,就指定props的类型、格式等
使用props校验作用: 捕获错误,给出明确的提示,增加组件的健壮性
使用步骤:
1 安装包:npm i prop-types
2 导入prop-types包
3 使用组件名.propType={} 添加校验规则
- import React from "react";
- import ReactDOM from "react-dom";
-
- // 2 导入prop-types包
- import PropTypes from "prop-types"
-
- class App extends React.Component {
-
- render() {
- const arr = this.props.colors
- const list=arr.map(
- (item,index)=><li key={index}>{item}</li>
- )
- return (
- <ul>
- {list}
- </ul>
- )
- }
- }
- //3 使用组件名.propType={} 添加校验规则
- App.propTypes={
- //约束组件的colors为数组类型
- colors:PropTypes.array
- }
- //此处传了一个不符合规范的类型
- ReactDOM.render(<App colors={19}/>, document.getElementById("root"));
- // ReactDOM.render(<App colors={['red','yellow']}/>, document.getElementById("root"));
控制台有明确的错误原因
修改代码改成正确的类型
- //此处传了一个不符合规范的类型
- //ReactDOM.render(<App colors={19}/>, document.getElementById("root"));
- ReactDOM.render(<App colors={['red','yellow']}/>, document.getElementById("root"));
1 常见类型:array、bool、func、number、object、string
2 react元素类型:element
3 必填项 isRequired → PropTypes.array.isRequired
4 特定结构的对象: shape({})
- // 使用组件名.propType={} 添加校验规则
- App.propTypes={
- //常见类型:array、bool、func、number、object、string
- a:PropTypes.number,
- //函数类型,且是必填项
- fn:PropTypes.func.isRequired,
- //tag属性是react的元素(element)
- tag:PropTypes.element,
- //shape:特定的结构 area是string类型,price是数字类型
- filter:PropTypes.shape({
- area:PropTypes.string,
- price:PropTypes.number
- })
-
- }
-
- ReactDOM.render(<App fn={()=>{}}/>, document.getElementById("root"));
格式: 组件.defaultProps={}
作用: 给props设置默认值,在未传入props时生效
- import React from "react";
- import ReactDOM from "react-dom";
-
- class App extends React.Component {
-
- render() {
- return(
- <div>
- <h1>值:{this.props.pageSize}</h1>
- </div>
- )
- }
- }
-
- //添加props默认值
- App.defaultProps={
- pageSize:10
- }
-
- ReactDOM.render(<App/>, document.getElementById("root"));
预览
传入props,默认值不再生效
ReactDOM.render(<App pageSize={20}/>, document.getElementById("root"));
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。