1.属性的定义

props 是正常是外部传入的,组件内部也可以通过一些方式来初始化的设置,属性不能被组件自己更
改,但是你可以通过父组件主动重新渲染的方式来传入新的 props。
这就是React中的单向数据流

2.属性的特点

属性是描述性质、特点的,组件自己不能随意更改,必须由父组件进行更改

3.属性的用法

在使用一个组件的时候,可以把参数放在标签的属性当中,所有的属性都会作为组件 props 对象的键值。
通过类创建的组件需要使用this.props来使用属性
import React, { Component } from 'react'
import Navbar from './Navbar'
export default class App extends Component {
state = {
//只能内部自己使用,外部无法改变
}
render() {
//上面父组件传来的一个对象
var obj = {
title: '测试',
leftshow: false
}
return (
<div>
<h2>首页</h2>
<Navbar title="首页" leftshow={false} ></Navbar>
<h2>列表</h2>
<Navbar title="列表" leftshow={true} rightshow={true}></Navbar>
<h2>购物车</h2>
{/* 如果对象里面的属性和组件的属性key一样可以用拓展运算符直接结构obj放入组件 */}
<Navbar title="购物车" {...obj}></Navbar>
</div>
)
}
}
import React, { Component } from 'react'
import propTypes from "prop-types"
export default class Navbar extends Component {
//a=100对象属性
state = {
//只能内部自己使用,外部无法改变
} //用static修饰属性就是类属性
static propTypes = {
title: propTypes.string,
leftshow: propTypes.bool,
rightshow: propTypes.bool,
}
//用static修饰属性就是类属性
static defaultProps = {
//属性默认值
leftshow: true,
rightshow: true,
title: ''
}
//属性是父组件传过来的,this.props
render() { console.log(propTypes)
let { title, leftshow, rightshow } = this.props return (
<div style={{ display: 'flex' }}>
{leftshow && <button>返回</button>}
{/* <div>{ this.props.title}</div> */}
<div>{title}</div>
{rightshow && <button>Home</button>} </div>
)
}
}
// Navbar.defalutProps={
// leftshow:false,
// rightshow:true,
// title:''
// }
/* Navbar.propTypes = {
title: propTypes.string,
leftshow: propTypes.bool,
rightshow: propTypes.bool, } *///类属性
/*
给组件类加上一个propTypes属性在里面使用prop-types模块封装好的方法即可
验证属性 */
通过函数创建的组件,需要通过函数的参数来接收 props 
 
import React, { Component } from 'react'
import Navbar from './Navbar'
import Sidebar from './Sidebar' export default class App extends Component {
render() {
return (
<div>
{/* 类组件 */}
<Navbar title="导航"></Navbar>
{/* 函数式组件 */}
<Sidebar bg="yellow" position="left"></Sidebar>
</div>
)
}
}
import React from 'react'
import propTypes from "prop-types"
export default function Sidebar(props) {
console.log(props)
let { bg, position } = props
let obj = { backgroundColor: bg, position: "fixed" }
let obj1 = { right: 0 }
let obj2 = { left: 0 }
// eslint-disable-next-line eqeqeq
position == 'right' ? obj = { ...obj1, ...obj } : obj = { ...obj2, ...obj }
return (
<div style={obj}>
<ul>
<li>11111</li>
<li>11111</li>
<li>11111</li>
<li>11111</li>
<li>11111</li>
<li>11111</li>
<li>11111</li>
<li>11111</li>
</ul>
</div>
)
}
//Sidebar.defaultProps 默认属性
Sidebar.defaultProps = {
bg: 'red',
position: 'fixed'
}
//Sidebar.propTypes 属性验证
Sidebar.propTypes = {
bg: propTypes.string,
position: propTypes.string
}
注意:
1).注意在传参数时候,如果写成isShow="true" 那么这是一个字符串 如果写成isShow={true} 这个

是布尔值
2).当你想要传递的属性key和value名字一致时,可以使用ES6的解构语法来快速赋值{...对象}

3)设置属性默认值,可以给属性设置默认值,当父组件没有传递属性时,子组件中会采用设置的默认值来使用。
在类组件和函数组件中设置属性默认值的方法是不同的
在类组件中,通过类属性defaultProps可以给属性设置默认值

 
  //用static修饰属性就是类属性
static defaultProps = {
//属性默认值
leftshow: true,
rightshow: true,
title: ''
}

在函数组件中,通过 函数名.defaultProps来设置属性的默认值

import React from 'react'

export default function Sidebar(props) {
console.log(props)
let { bg, position } = props
let obj = { backgroundColor: bg, position: "fixed" }
let obj1 = { right: 0 }
let obj2 = { left: 0 }
// eslint-disable-next-line eqeqeq
position == 'right' ? obj = { ...obj1, ...obj } : obj = { ...obj2, ...obj }
return (
<div style={obj}>
<ul>
<li>11111</li>
<li>11111</li>
<li>11111</li>
<li>11111</li>
<li>11111</li>
<li>11111</li>
<li>11111</li>
<li>11111</li>
</ul>
</div>
)
}
//Sidebar.defaultProps 默认属性
Sidebar.defaultProps={
bg:'red',
position:'fixed'
}

4).设置属性的类型验证,可以通过设置属性的类型验证来限制属性的类型。

注意在进行类型验证时需要先导入React自带的prop-types

import propTypes from "prop-types"

同样类组件是通过静态属性propTypes来设置类型验证

static propTypes = {
title: propTypes.string,
leftshow: propTypes.bool,
rightshow: propTypes.bool,
}

函数组件是通过组件名.propTypes来设置类型验证

import React from 'react'
import propTypes from "prop-types"
export default function Sidebar(props) {
console.log(props)
let { bg, position } = props
let obj = { backgroundColor: bg, position: "fixed" }
let obj1 = { right: 0 }
let obj2 = { left: 0 }
// eslint-disable-next-line eqeqeq
position == 'right' ? obj = { ...obj1, ...obj } : obj = { ...obj2, ...obj }
return (
<div style={obj}>
<ul>
<li>11111</li>
<li>11111</li>
<li>11111</li>
<li>11111</li>
<li>11111</li>
<li>11111</li>
<li>11111</li>
<li>11111</li>
</ul>
</div>
)
}
//Sidebar.defaultProps 默认属性
Sidebar.defaultProps = {
bg: 'red',
position: 'fixed'
}
//Sidebar.propTypes 属性验证
Sidebar.propTypes = {
bg: propTypes.string,
position: propTypes.string
}
 
 
 
 

React学习笔记16-属性props的更多相关文章

  1. react学习笔记_03-组件&props

    组件 & Props的学习 组件允许你将 UI 拆分为独立可复用的代码片段,并对每个片段进行独立构思. 组件,从概念上类似于 JavaScript 函数.它接受任意的入参(即 “props”) ...

  2. React学习笔记 - 组件&Props

    React Learn Note 4 React学习笔记(四) 标签(空格分隔): React JavaScript 三.组件&Props 组件可以将UI切分成一些独立的.可复用的部件,这样你 ...

  3. react学习笔记1--基础知识

    什么是react A JAVASCRIPT LIBRARY FOR BUILDING USER INTERFACES[React是一个用于构建用户界面的JavaScript库.] React之所以快, ...

  4. React学习笔记(一)- 入门笔记

    React入门指南 作者:狐狸家的鱼 本文链接:React学习笔记 GitHub:sueRimn 1.组件内部状态state的修改 修改组件的每个状态,组件的render()方法都会再次运行.这样就可 ...

  5. React学习笔记(六)事件处理

    React学习笔记(六) 五.事件处理 React事件绑定属性的命名采用驼峰写法,不同于传统DOM全部小写. 如果采用JSX的语法,事件函数需要用大括号{}包裹函数名,不同于传统DOM字符串小括号的方 ...

  6. React学习笔记(五)State&声明周期

    React学习笔记(五) 四.State&声明周期 可以为组件添加"状态(state)".状态与属性相似,但是状态是私有的,完全受控于当前组件. 局部状态就是只能用于类(定 ...

  7. React学习笔记 - JSX简介

    React Learn Note 2 React学习笔记(二) 标签(空格分隔): React JavaScript 一.JSX简介 像const element = <h1>Hello ...

  8. Ext.Net学习笔记16:Ext.Net GridPanel 折叠/展开行

    Ext.Net学习笔记16:Ext.Net GridPanel 折叠/展开行 Ext.Net GridPanel的行支持折叠/展开功能,这个功能个人觉得还说很有用处的,尤其是数据中包含图片等内容的时候 ...

  9. SQL反模式学习笔记16 使用随机数排序

    目标:随机排序,使用高效的SQL语句查询获取随机数据样本. 反模式:使用RAND()随机函数 SELECT * FROM Employees AS e ORDER BY RAND() Limit 1 ...

  10. React学习笔记(七)条件渲染

    React学习笔记(七) 六.条件渲染 使用if或条件运算符来创建表示当前状态的元素. 可以使用变量来存储元素.比如: let button = null; if (isLoggedIn) { but ...

随机推荐

  1. Linux 软件包:lvm

    lvm LVM是 Logical Volume Manager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制. Linux用户安装Linux操作系统时遇到的一个常见的难以决定的 ...

  2. KVM 硬盘分区扩容(GPT与MBR两种分区、fdisk 与 growpart两种方法)

    因为认知顺序的原因,之前我都是用fdisk命令手工删除分区表后重建进行扩容,后面才发现可以用growpart命令. 实战建议直接点 AWS EC2 存储空间扩容 跳转过去参考,学习操作可以继续往下看. ...

  3. 文心一言 VS 讯飞星火 VS chatgpt (66)-- 算法导论6.5 5题

    五.试分析在使用下列循环不变量时,HEAP-INCREASE-KEY 的正确性:在算法的第4~6行 while循环每次迭代开始的时候,子数组 A[1..A.heap-size]要满足最大堆的性质.如果 ...

  4. 可托拉拽的WPF选项卡控件,强大好用!

    推荐一个简单易用的WPF选项卡控件. 项目简介 这是一个基于WPF开发的,可扩展.高度可定制.轻量级的UI组件,支持拖拉拽功能,可以让开发人员快速实现需要选项卡窗口的系统. 特色功能 1.拖拉拽标签: ...

  5. C#/.net/DotNet/Emgu.CV裁剪照片头像

    头像裁剪有利于人脸识别批量照片预处理,安防领域可以快速通过视频定位人脸,进行抓拍,做人脸识别相关功能的可能会应用到人脸裁剪,以下是我在实践中应用的代码,如有需要复制粘贴即可使用. using Emgu ...

  6. Django: request.query_params取值

    取值 request.query_params.dict(),将querydict对象转换为字典 参考链接 https://www.jianshu.com/p/f2f73c426623 https:/ ...

  7. NAT与NAT实验

    1.NAT与NAT实验 NAT(网络地址翻译) 一个数据包目的ip或者源ip为私网地址, 运营商的设备无法转发数据. 实际场景问题 如下图 201.0.0.1 公网地址?   买的 运营商给你的​19 ...

  8. [nginx]lua读取请求体

    前言 nginx默认不读取请求体的数据,但可以通过$request_body内置变量来获取.$request_body存在内存中,如果它的字节大小超过nginx配置的client_body_buffe ...

  9. [gin]数据解析和绑定

    前言 go version: 1.18 本文主要包含JSON.Form.Uri.XML的数据解析与绑定. JSON数据解析与绑定 go代码 package main import ( "ne ...

  10. 如何破解wifi密码?

    前期准备: kali 系统 外置无线网卡 破解过程: 首先,需要登录kali系统,可以是虚拟机. 在虚拟机中设置点击 虚拟机-可移动设备-无线网卡的名称,将无线网卡绑定到kali虚拟机上. 在kali ...