将状态传递给中继中的 getVaribles 突变

Posted

技术标签:

【中文标题】将状态传递给中继中的 getVaribles 突变【英文标题】:passing state to getVaribles Mutation in Relay 【发布时间】:2017-01-26 12:33:14 【问题描述】:

如何将this.state.username;, this.state.password; 之类的状态传递给Relay.Mutationget variables /config,其中 this.state.username 和 this.state.password 被映射到文本字段中的输入值,这使得 loginMutation this.state 返回 null 中继中的所有示例似乎是一方面(创建查询),我有Login ComponentLogin Mutation 这是我的文件

//loginMutation named as verifyMutation.js
import Relay from 'react-relay';

class VerifyMutation extends Relay.Mutation 

  getMutation() 
    return Relay.QL`
      mutation  mpesaVerify 
    `;
  

  getVariables() 
    return 
      phoneNumber: this.state.username,//this.state return null
      transactionID: this.state.password//this.state retuns null
    ;
  

  getFatQuery() 
    return Relay.QL`
      fragment on verificationPayload 
        featureEdge,
        viewer  features 
      
    `;
  

  getConfigs() 
    return [
      type: 'RANGE_ADD',
      parentName: 'viewer',
      parentID: this.props.viewerId,
      connectionName: 'features',
      edgeName: 'featureEdge',
      rangeBehaviors: 
        '': 'append',
      ,
    ];
  


export default VerifyMutation;

这里是 loginComponent

//loginComponent.js
import React from 'react';
import Relay from 'react-relay';

import  Grid, Cell, Button, Textfield  from 'react-mdl';

import  VerifyMutation from './VerifyMutation';

import Page from '../Page/PageComponent';
import info from './infoComponent';

import styles from './Verify.scss';



export default class Verify extends React.Component 

  static propTypes = 
    viewer: React.PropTypes.object.isRequired
  ;

  constructor (props)
    super(props);
    this.state =  username:'',password:''
  ;

  onUsernameChange(e)
    this.setState(username:e.target.value);
  ;
  onPasswordChange (e)
    this.setState(password:e.target.value);
  ;

  handleSubmit = (e)=>
    e.preventDefault();
    //enter relay world
    const verifyMutation = new VerifyMutation(viewerId:this.props.viewer.id, ...this.state);
    Relay.Store.commitUpdate(verifyMutation, onError: err => console.error.bind(console,err));

  



  render() 

    return (

      <div>
        <Page heading='Verify Payments'>
          <Grid>
            <Cell col=4>
              <h3>How to go about it</h3>
              <p>
                username: this.state.username and
                password: this.state.password
              </p>
            </Cell>
            <Cell col=4>
              /*if verified show results here instead of this */
              <form  onSubmit=this.handleSubmit.bind(this) >
                <Textfield
                  value=this.state.username
                onChange=this.onUsername.bind(this)
                error="username please"
                label="username."
                error="please use valid username"
                required=true
                style=width: '200px'/>
                <Textfield
                  value=this.state.username
                  onChange=this.onUsernameChange.bind(this)
                  pattern="[A-Z0-9]7,10"
                  error="should be 7 to 10 letters"
                  label="password"
                  required=true
                  style=width: '200px'
                />
                <input type="hidden" value=this.props.viewer.id />
                <Button raised colored >Verify</Button>
              </form>
            </Cell>
            <Cell col=4>
            </Cell>
          </Grid>
        </Page>
      </div>

    );

  


我遇到的问题是,大多数示例都使用道具,而这些道具并不是反应的方式,因为我们将状态用于随时间变化的字段,即突变任何人 提前致谢

【问题讨论】:

【参考方案1】:

这里唯一的问题是您在突变本身中引用状态。您将组件的状态作为道具传递给突变 - 这与您将状态作为道具传递给子组件完全相同。

因此,要解决此问题,您只需将state 的用法更改为props 在您的getVariables 方法中。

【讨论】:

以上是关于将状态传递给中继中的 getVaribles 突变的主要内容,如果未能解决你的问题,请参考以下文章

中继项目中的更新突变问题

将变量传递给现代中继中的片段容器

中继突变:突变分页关联

如何乐观响应中继现代突变中的连接属性?

多重突变:如何让第一个突变将 ID 传递给第二个突变

将函数结果传递给 graphql 突变