首页 > 其他分享 >React学习笔记16-属性props

React学习笔记16-属性props

时间:2023-11-03 14:48:06浏览次数:38  
标签:obj 16 11111 React propTypes props 组件 属性

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
}

 

 

 

 

 

 

 

   

标签:obj,16,11111,React,propTypes,props,组件,属性
From: https://www.cnblogs.com/SadicZhou/p/17807536.html

相关文章

  • oracle异常问题ORA-01116、ORA-01110、ORA-27041:无法打开文件
    select*fromdba_data_files;ORA-01116:打开数据文件3出错ORA-01110:数据文件3:'/home/oracle/dmpfile20200903/test_xfh_db.dbf'ORA-27041:无法打开文件Linux-x86_64Error:2:NosuchfileordirectoryAdditionalinformation:301116.00000-"errorinopening......
  • React学习笔记17-属性VS状态
    相似点:都是纯js对象,都会触发render更新,都具有确定性(状态/属性相同,结果相同)不同点:1.属性能从父组件获取,状态不能2.属性可以由父组件修改,状态不能3.属性能在内部设置默认值,状态也可以,设置方式不一样4.属性不在组件内部修改,状态要在组件内部修改5.属性能设置子组件初始值......
  • React 中复制静态文件到 build的文件夹中
    React中复制静态文件到build的文件夹中环境:umi 框架前提:在跟目录下放置了Dockerfile 文件,在build时需要自动复制到dist文件夹里面。 1. 安装 copy-webpack-plugin 插件 2. .umirc.ts 文件中使用copy命令import{defineConfig}from"umi";exportdefaultde......
  • React 中设置环境变量(开发环境、测试环境和生产环境)
    React中设置环境变量(开发环境、测试环境和生产环境)环境React,Umi框架 1. 安装插件:cross-envnpmicross-env-S  2. 修改 package.json 文件"scripts":{"dev":"cross-envREACT_APP_ENV=devumidev","dev:prod":"cross-envREACT......
  • 16Go语言基础之接口
    接口(interface)定义了一个对象的行为规范,只定义规范不实现,由具体的对象来实现规范的细节。接口本章学习目标了解为什么需要接口以及接口的特点掌握接口的声明和使用掌握接口值的概念掌握空接口的特点及其使用场景在Go语言中接口(interface)是一种类型,一种抽象的类型。相较于......
  • 【noip赛前20天冲刺集训 day16】星空遗迹
    Description在石头剪刀布中,一共有三种手势:\(R(Rock),P(Paper),S(Scissors)\),其中\(R\)能赢\(S\),\(S\)能嬴\(P\),\(P\)能赢\(R\)。现在,我们定义\(w(x,y)\)是\(x\)和\(y\)中获胜的手势,特别地,如果\(x\)和\(y\)相同(也就是平局),那么\(w(x,y)\)也和\(x,y\)均......
  • React面试题: 我是否可以在项目中不断使用React.Component来优化项目
    React.PureComponent是React的一个组件,主要用于性能优化,可以避免不必要的渲染。它的主要特点是:如果组件的props和state没有发生变化,则不会重新渲染(此处原理类似React.memo)。可以自动检查对象和数组,判断其是否需要重新渲染(是浅比较)。但是,React.PureComponent的缺点......
  • React面试题: useCallBack()与React.memo的区别与使用常见场景
    React.usecallback与React.memo的区别:React.useCallback和React.memo是两种不同的优化方式:主要功能:它们都可以避免不必要的渲染,提高React应用的性能。React.useCallback是Hoc(高阶组件)的解决方案,可以用于优化函数组件和Class组件,注意这里适用于React高阶组件的渲染解......
  • 1116.马走日
    注意是否需要回溯#include<iostream>#include<algorithm>usingnamespacestd;constintN=15;intsx,sy,n,m,t,ans;boolvis[N][N];intdx[]={-2,-1,1,2,2,1,-1,-2},dy[]={1,2,2,1,-1,-2,-2,-1};voiddfs(intsx,intsy,intcnt){......
  • 直播小程序源码,react-native自定义文本输入框
    直播小程序源码,react-native自定义文本输入框Examplesfromprops: ... _onChange=(label,value)=>{  this.setState({[label]:value}); }; render(){  return(   <Viewstyle={styles.container}>    <Text>     {this.stat......