react三大核心之一props

-

html标签可以在标签上写自定义属性,那么react的组件,也可以像传属性一项,给组件传props;

react组件接收到传入的属性后,会自动塞进实例的props属性中,通过this.props可以拿到外部传入的属性

来看一下props的基本使用

复制代码
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>组件实例核心属性1:state</title>
</head>
<body>
  <!-- 准备一个容器 -->
  <div id="test"></div>
  <div id="test2"></div>
  <div id="test3"></div>
  <div id="test4"></div>
  <!-- 引入react核心库 -->
  <script src="https://cdn.bootcdn.net/ajax/libs/react/18.2.0/umd/react.development.min.js"></script>
  <!-- 引入react-dom, 用于支持react操作dom, 需要在核心库之后引入 -->
  <script src="https://cdn.bootcdn.net/ajax/libs/react-dom/18.2.0/umd/react-dom.development.min.js"></script>
  <!-- 引入babel.js,用于将jsx转化为js -->
  <script src="https://cdn.bootcdn.net/ajax/libs/babel-standalone/7.18.7/babel.min.js"></script>

  <script type="text/babel">
    // 1.创建类组件
    class Person extends React.Component{
      render() {
        console.log(this);
        const { name, age, sex } = this.props;
        return (
          <ul>
            <li>姓名: {name}</li>
            <li>性别: {sex}</li>
            <li>年龄: {age}</li>
          </ul>
        )
      }
    } 
    // 挂载
    ReactDOM.render(<Person name="tom" age="18" sex="" />, document.getElementById('test'))
    ReactDOM.render(<Person name="老刘" age="30" sex="" />, document.getElementById('test2'))
    ReactDOM.render(<Person name="老王" age="19" sex="" />, document.getElementById('test3'))
    // 批量传递props
    const p = { name: '老李', age: 20, sex: '' };
    ReactDOM.render(<Person {...p} />, document.getElementById('test4')) // name展示 老李
    p.name = 'xxx';
  </script>
</body>
</html>
复制代码

props类型限制:

复制代码
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>组件实例核心属性1:state</title>
</head>
<body>
  <!-- 准备一个容器 -->
  <div id="test"></div>
  <div id="test2"></div>
  <div id="test3"></div>
  <div id="test4"></div>
  <!-- 引入react核心库 -->
  <script src="https://cdn.bootcdn.net/ajax/libs/react/18.2.0/umd/react.development.min.js"></script>
  <!-- 引入react-dom, 用于支持react操作dom, 需要在核心库之后引入 -->
  <script src="https://cdn.bootcdn.net/ajax/libs/react-dom/18.2.0/umd/react-dom.development.min.js"></script>
  <!-- 引入babel.js,用于将jsx转化为js -->
  <script src="https://cdn.bootcdn.net/ajax/libs/babel-standalone/7.18.7/babel.min.js"></script>
  <!-- 引入prop-types -->
  <script src="https://cdn.bootcdn.net/ajax/libs/prop-types/15.8.1/prop-types.min.js"></script>
  <script type="text/babel">
    // 1.创建类组件
    class Person extends React.Component{
      render() {
        console.log(this);
        const { name, age, sex } = this.props;
        return (
          <ul>
            <li>姓名: {name}</li>
            <li>性别: {sex}</li>
            <li>年龄: {age}</li>
          </ul>
        )
      }
    }
    console.log(PropTypes, 'PropTypes===');
    // 对标签属性进行类型、必要性的限制
    // react会识别类的propTypes的静态属性,如果有代表对props有限制,如果没有,则没有限制
    Person.propTypes = {
      // name: React.propTypes.string, // 15版本及之前的写法,propTypes在React核心库中
      name: PropTypes.string.isRequired, // 15版本之后,从核心库抽离出来了  这里代表name必须是字符串类型,并且是必填的
      age: PropTypes.number.isRequired, // age必填,且为数值
      sex: PropTypes.string, // sex为字符转
      speak: PropTypes.func , // 限制speak为函数
    }
    // 给标签属性加默认值
    Person.defaultProps = {
      sex: '', //sex默认为男
    }
    // 挂载
    ReactDOM.render(<Person name="tom" age="18" sex="" speak={speak} />, document.getElementById('test'))
    ReactDOM.render(<Person name="老刘" age="30" />, document.getElementById('test2'))
    ReactDOM.render(<Person name="老王" age="19" sex="" />, document.getElementById('test3'))
    // 批量传递props
    const p = {  age: 20 };
    ReactDOM.render(<Person {...p} />, document.getElementById('test4'))// 给组件传递方法
    function speak() {
      console.log('我说话了');
    }
  </script>
</body>
</html>
复制代码

 props是只读属性,在组件内部不能修改

类组件如果写了构造函数,就必须用super接收props,否则this.props是undefined;所以能不写构造函数就不写构造函数;

构造函数在组件中的主要作用就是给初始state赋值以及改变this指向的作用。但是state赋值,可以用 state = this.props的方式;改变this指向可以用箭头函数来替代。

类组件对props的限制以及默认值的规则可以写在类的内部,用static关键字给类加静态属性

复制代码
// 1.创建类组件
    class Person extends React.Component{
      constructor(props) {
        // 如果写了构造器,必须用super接收props,否则this.props是undefined;不写构造器没问题
        console.log(props, 'props');
        super(props)
      }

      static propTypes = {
        name: PropTypes.string.isRequired,
        age: PropTypes.number.isRequired, 
      }

      // 给标签属性加默认值
      static defaultProps = {
        sex: '男', //sex默认为男
      }

      render() {
        console.log(this);
        const { name, age, sex } = this.props;
        return (
          <ul>
            <li>姓名: {name}</li>
            <li>性别: {sex}</li>
            <li>年龄: {age}</li>
          </ul>
        )
      }
    }
    
    // 挂载
    ReactDOM.render(<Person name="tom" age="18" sex="女" />, document.getElementById('test'))
复制代码

旧版函数组件不能玩转 state和refs,但是可以玩 props

复制代码
// 函数是组件
    function Person(props) {
      console.log(props, 'props');
      const { name, sex, age } = props;
      return (
        <ul>
          <li>姓名: {name}</li>
          <li>性别: {sex}</li>
          <li>年龄: {age}</li>
        </ul>
      )
    }
    // 对props进行限制
    Person.propTypes = {
      name: PropTypes.string.isRequired,
      age: PropTypes.number.isRequired, 
    }

    // 给标签属性加默认值
    Person.defaultProps = {
      sex: '男', //sex默认为男
    }

    // 挂载
    ReactDOM.render(<Person name="tom" age="18" sex="女" />, document.getElementById('test'))
复制代码

 

 

 

 

-

posted @   古墩古墩  Views(80)  Comments(0Edit  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· Windows 提权-UAC 绕过
点击右上角即可分享
微信分享提示