react 函数式组件中使用props

本文对比了函数式组件和类组件中如何访问和使用props。在函数组件中,由于没有组件实例,需通过参数直接获取props;而在类组件中,通过this.props访问props。讲解了如何正确在函数组件中获取props数据并给出了示例代码。
摘要由CSDN通过智能技术生成

我们之前学习的一直是组件实例上的props,是可以通过this访问组件实例的,比如props,可以通过this.props访问,但是在函数式组件中,不存在组件实例。

function Person() {
  return (
    <ul>
      <li>姓名:{name}</li>
      <li>性别:{sex}</li>
      <li>年龄:{age + 1}</li>
    </ul>
  );
}

这是一个比较简单的函数式组件,和上文一样,想展示姓名,性别,年龄信息。

class Person extends React.Component {
  static propTypes = {
    name: PropTypes.string.isRequired,
    sex: PropTypes.string,
    age: PropTypes.number,
    speak: PropTypes.func,
  };
  // 设置默认属性
  static defaultProps = {
    sex: "女",
    age: 18,
  };
  state = {};
  render() {
    const { name, sex, age } = this.props;
    // prop是只读的
    // this.props.name = "jack";
    return (
      <ul>
        <li>姓名:{name}</li>
        <li>性别:{sex}</li>
        <li>年龄:{age + 1}</li>
      </ul>
    );
  }
}

类组件种有一行关键代码

const { name, sex, age } = this.props;

所有的props数据都是从this.props,也就是组件实例对象中取出来的,而在函数式组件中this是undefined。
正确的获取数据方式是从参数中获取

<script type="text/babel">
  function Person(props) {
    return (
      <ul>
        <li>姓名:{name}</li>
        <li>性别:{sex}</li>
      </ul>
    );
  }
  ReactDOM.render(<Person name="tom" sex="男" />, document.getElementById("test"));
</script>

在这里插入图片描述
完整代码,包括限制

<script type="text/babel">
  function Person(props) {
    const { name, sex } = props;
    return (
      <ul>
        <li>姓名:{name}</li>
        <li>性别:{sex}</li>
      </ul>
    );
  }
  Person.propTypes = {
    name: PropTypes.string.isRequired,
    sex: PropTypes.string,
    age: PropTypes.number,
    speak: PropTypes.func,
  };
  Person.defaultProps = {
    sex: "女",
    age: 18,
  };
  ReactDOM.render(
    <Person name="tom" sex="男" />,
    document.getElementById("test")
  );
</script>
React函数组件使用dva主要是通过dva的API来连接React组件和dva的数据流。dva是一个基于Redux和Redux-Saga的轻量级前端框架,它简化了React应用状态管理的复杂性。下面是在函数组件使用dva的基本步骤: 1. 创建一个dva实例,并定义应用的模型(model)、路由(route)、插件(plugin)和间件(middleware)等。 2. 在React组件,通过`useModel`钩子函数来获取model的state和dispatch,从而订阅状态和发送action。 3. 使用`useEffect`或`useLayoutEffect`等React钩子来处理副作用,如发起异步请求等。 4. 使用`connect`方法来连接React组件和dva的model。这个步骤也可以通过自定义钩子`useModelState`和`useModelActions`来实现。 这里是一个简化的示例代码: ```javascript // 1. 引入dva和你需要连接的model import { useModel } from 'dva'; import { Button } from 'antd'; function MyComponent(props) { // 2. 使用useModel钩子获取model的state和dispatch const [state, dispatch] = useModel('myModel'); // 3. 在合适的生命周期内发起异步操作,例如使用useEffect React.useEffect(() => { // 获取数据的逻辑 dispatch({ type: 'myModel/fetchData' }); }, []); // 4. 渲染UI return ( <Button onClick={() => { dispatch({ type: 'myModel/changeSomething' }) }}> {state.someData} </Button> ); } export default MyComponent; ``` 在这个示例,我们通过`useModel`钩子连接了名为`myModel`的model,然后在组件加载时通过`useEffect`发起数据获取的action。当用户点击按钮时,会触发另一个action来改变model的状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值