【问题标题】:Destructured object as function parameter解构对象作为函数参数
【发布时间】:2019-10-27 06:23:04
【问题描述】:

看不懂下面const Posts的参数。我对 node/React 还很陌生。它是一个解构的参数对象吗?还是只是作为参数传递的对象?

getPosts 和 post 显示为未定义。但是我不明白参数对象是从哪里传递到函数中的......

完整代码在这里:https://github.com/bradtraversy/devconnector_2.0/blob/master/client/src/components/posts/Posts.js

提前致谢!!

import React, { Fragment, useEffect } from 'react';
import PropTypes from 'prop-types';
import { connect } from 'react-redux';
import Spinner from '../layout/Spinner';
import PostItem from './PostItem';
import PostForm from './PostForm';
import { getPosts } from '../../redux/actions/post';

const Posts = ({ getPosts, post: { posts, loading } }) => {
  useEffect(() => {
    getPosts();
  }, [getPosts]); ```

【问题讨论】:

  • 是的,它是一个期望对象的函数,并在其参数声明中对其进行解构。
  • "但我不明白参数对象是从哪里传递到函数中的..." - 看看调用的代码 Posts

标签: javascript reactjs destructuring


【解决方案1】:

所以PostsReact Function component

所有 Function 组件都将接收一个 props 对象作为其第一个参数。

const Posts = (props) => { /* ... */ }

props 将始终是一个对象,其中包含在渲染组件时传递给它的 props,例如:

import Posts from './path/to/Posts'

function SomeParentComponent() {
  return <Posts limit={10} categories={{news:true, sports:false}} />
}

在这种情况下,props 将是一个如下所示的对象:

{
  limit : 10,
  categories : {
    news : true,
    sports : false,
  }
}

你当然可以在你的组件中解构 props 对象:

const Posts = (props) => {
  const { 
   limit,
   categories
  } = props
  // ... other stuff
}

但您可以更进一步,进行所谓的“解包”以解构嵌套属性

const Posts = (props) => {
  const { 
   limit,
   categories : {
     sports,
     news
   }
  } = props
  // ... other stuff
}

最后,您可以在参数用于相同结果的情况下内联解构和解压缩对象,而不是在函数体中这样做。

const Posts = ({limit, categories:{news,sports}}) => {
  // ... other stuff
}

您的代码示例正在做什么。

它似乎期望父组件作为getPosts 属性传递一个函数,调用该属性时首先将posts.loading 设置为true,加载帖子,然后将posts.loading 设置为false。例如:

function SomeParentComponent() {
  const [loading, setLoading] = useState(false)
  const [posts, setPosts] = useState([])

  const loadPosts = useCallback(async () => {
    setLoading(true)
    const loadedPosts = await loadPostsSomehow()
    setPosts([posts, ...loadedPosts])
    setLoading(false)
  }, [])
  return <Posts getPosts={loadPosts} post={{posts, loading}} />
}

请务必使用useCallback 在此处获取记忆回调,否则您将陷入无限循环

**编辑**

实际查看提供的链接后,实际上略有不同。 post对象不是由父组件提供,而是由redux提供,但逻辑基本相同。不同的是,不是父组件改变加载和发布状态,而是通过 redux 状态管理来完成。

【讨论】:

  • 绝妙的答案 - 完全解释了它。非常感谢!我花了几个小时试图理解它。
  • 我不建议在参数所在的地方解构和解压对象,因为您可能需要访问整个 props 对象,例如使用 {...props} 将所有道具传递给孩子
【解决方案2】:

是的,它是解构函数参数对象。

在您的情况下,Posts 的参数通过 Redux connect() 函数。

const mapStateToProps = state => ({
  post: state.post
});

export default connect(
  mapStateToProps,
  { getPosts }
)(Posts);

检查您的 getPosts 导入并确保它不是 undefined

import { getPosts } from '../../actions/post';

还要检查你的 redux 状态并确保它有 state.post

【讨论】:

  • 啊...忘记将帖子添加到根减速器 (reducers/index.js)。调试 React/node 比调试 php 困难得多!
  • 是的,一开始很混乱。但是在大型应用程序中,如果你接受 React 和 Redux 设置,你就会喜欢它。
猜你喜欢
  • 2017-11-14
  • 1970-01-01
  • 1970-01-01
  • 2017-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-17
相关资源
最近更新 更多