为 apollo 客户端创建反应组件,带有对象参数的简单模型

Posted

技术标签:

【中文标题】为 apollo 客户端创建反应组件,带有对象参数的简单模型【英文标题】:creation react component for apollo client, simple model with object parameters 【发布时间】:2018-02-17 01:06:15 【问题描述】:

我知道 react 组件可以通过两种方式创建,使用“扩展 React.Component”或仅在下面的组件中创建对象。 我的问题是,在第二种方式中,参数是如何工作的,例如“const ChannelsList = ( data: loading, error, channels )”

如果我在“数据”对象中更改 xchannels 的名称“通道”,然后我在 "xchannels.map(...)...)" 上尝试此新更改,则页面给出错误:

ChannelsListWithData.js:24 Uncaught TypeError: Cannot read property 'map' of undefined
    at ChannelsList (ChannelsListWithData.js:24)
    at StatelessComponent.render (ReactCompositeComponent.js:44)
    at ReactCompositeComponent.js:795
    at measureLifeCyclePerf (ReactCompositeComponent.js:75)
    at ReactCompositeComponentWrapper._renderValidatedComponentWithoutOwnerOrContext (ReactCompositeComponent.js:794)
    at ReactCompositeComponentWrapper._renderValidatedComponent (ReactCompositeComponent.js:821)
    at ReactCompositeComponentWrapper._updateRenderedComponent (ReactCompositeComponent.js:745)
    at ReactCompositeComponentWrapper._performComponentUpdate (ReactCompositeComponent.js:723)
    at ReactCompositeComponentWrapper.updateComponent (ReactCompositeComponent.js:644)
    at ReactCompositeComponentWrapper.receiveComponent (ReactCompositeComponent.js:546)
ChannelsList @ ChannelsListWithData.js:24
StatelessComponent.render @ ReactCompositeComponent.js:44
(anonymous) @ ReactCompositeComponent.js:795
measureLifeCyclePerf @ ReactCompositeComponent.js:75
_renderValidatedComponentWithoutOwnerOrContext @ ReactCompositeComponent.js:794
  ....

就像函数不接受任何变量名一样。为什么?

它是如何在react那个对象中工作的,以及参数名称和名称,有链接可以理解吗?像php这样的经典程序语言很简单:函数(参数)

组件:

import React from 'react';
import 
  Link
 from 'react-router-dom'

import 
    gql,
    graphql,
 from 'react-apollo';

import AddChannel from './AddChannel';

const ChannelsList = ( data: loading, error, channels ) => 
  if (loading) 
    return <p style=color:"red">Loading ...</p>;
  
  if (error) 
    return <p>error.message</p>;
  

  return (
    <div className="channelsList">
      <AddChannel />
       channels.map( ch =>
        (<div key=ch.id className='channel ' + (ch.id < 0 ? 'optimistic' : '')>
          <Link to=ch.id < 0 ? `/` : `channel/$ch.id`>
            ch.name
          </Link>
        </div>)
      )
    </div>
  );
;

export const channelsListQuery = gql`
  query ChannelsListQuery 
    channels 
      id
      name
    
  
`;

export default graphql(channelsListQuery, 
  options:  pollInterval: 10000 ,
)(ChannelsList);

组件来自本教程:

https://dev-blog.apollodata.com/tutorial-graphql-input-types-and-client-caching-f11fa0421cfd

【问题讨论】:

【参考方案1】:

没有错。

经典编程语言(如 javascript)也可以正常工作。

与php侧面比较,代码是一样的:)

在本例中,parameters 是一个同时具有 datamatch 属性的对象。

你可以很容易地把它翻译成:

const ChannelDetails(parameters) 
  const  data, match  = parameters
  ...
  // Classic way (like php I presume)
  const data = parameters.data
  const channel = parameter.data.channel

更进一步,我建议您阅读 JavaScript 中的对象解构。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment

您还问过:“参数是如何工作的......?”

这些parameters 是您在渲染组件时发送的组件道具。 例如:

<ChannelDetails
  data= channel: [], loading: false, error: '' 
  match="value here"
/>

【讨论】:

您好,感谢您对函数的解释。我明白了,我已经更新了我的问题,因为我在组件上犯了一个错误,基本上是一样的,只有如果我将变量名“通道”更改为另一个,我会遇到问题,请查看我更新的问题。这是我们阿波罗的反应行为? 尝试将ChannelDetails( data: loading, error, channels ) 替换为ChannelDetails(props)。然后console.log(props) 并检查输出。也许您无法更改属性名称。 如果我在“加载、错误、通道”中更改任何变量名称也会出现错误...理论上我可以按我的意愿命名变量? 所以我猜你不能从ChannelDetails 组件中更改它们的名称。谁是父组件?检查它是如何将道具传递给ChannelDetails 我现在明白了,我不能更改名称变量,因为它不是像 php 函数(parameter1,parameter 2..)这样的纯函数,而是一个将名称参数硬编码的对象,谢谢!跨度>

以上是关于为 apollo 客户端创建反应组件,带有对象参数的简单模型的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 apollo 客户端库创建带有角度参数的 graphql 查询

使用带有反应生命周期方法的 react-apollo 2.1 突变

如何使用 React HashRouter 和 Apollo 客户端渲染反应类组件?

Apollo 客户端(反应) - 无法更新未安装组件的状态

通过 apollo 客户端测试使用查询和订阅的反应组件

在类组件的方法中获取查询