掌握 React 中 Flux 背后的理论

Posted

技术标签:

【中文标题】掌握 React 中 Flux 背后的理论【英文标题】:Grasping the theory behind Flux in React 【发布时间】:2015-12-31 08:12:28 【问题描述】:

我一直在将类似 Flux 的架构应用到我的 React 应用程序中,我想知道应用程序状态是否真的应该保存在商店而不是组件中。似乎在某些情况下,让某些组件保持自己的状态可能会很好。

例如,下面的自我意识FormElement。我无法想象使用类似 Flux 的架构来编写它,其中所有内容都作为操作发送到商店。商店如何可能跟踪所有不同的表单元素及其父表单?

简而言之:让一些组件跟踪自己的状态,而大多数其他组件使用调度是否可以接受?

FormElement = React.createClass(
  displayName: 'FormElement',

  validations: 
    email: /^[A-Za-z0-9-._+]+@[A-Za-z0-9-]+[.A-Za-z0-9-]*\.[A-Za-z]2,$/,
    password: /.6,/
  ,

  propTypes: 
    id: React.PropTypes.string.isRequired,
    label: React.PropTypes.string.isRequired,
    type: React.PropTypes.string,
    required: React.PropTypes.bool
  ,

  getDefaultProps() 
    return 
      type: 'text',
      required: false,
      disabled: false
    
  ,

  getInitialState() 
    return 
      focused: false,
      filled: false,
      valid: true,
      invalidMessage: ''
    
  ,

  handleFocus(focusing) 
    let valid = true, errMsg = '';
    let inputVal = React.findDOMNode(this.refs.inputField).value;

    this.setState(focused: focusing);

    if (!focusing) 
      // Do some validations on blur
      if (this.props.required && !this.state.filled) 
        valid = false;
        errMsg = this.props.label + ' is required';
      

      if (this.props.type === 'email' &&
        this.state.filled && !this.validFormat(inputVal, 'email')) 
        valid = false;
        errMsg = 'Invalid email address';
       else if (this.props.type === 'password' &&
        this.state.filled && !this.validFormat(inputVal, 'password')) 
        valid = false;
        errMsg = 'Password too short';
      
    

    this.setState(valid, invalidMessage: errMsg, function () 
      // Notify parent that something changed
      //this.props.onAction(this);
    );
  ,

  handleChange(target) 
    this.setState(
      value: target.value,
      filled: target.value.length > 0
    );
  ,

  validFormat(str, type) 
    return !!str.match(this.validations[type]);
  ,

  render() 
    let formElement;
    const labelClasses = classNames(
      'focused': this.state.focused || this.state.filled
    );
    const groupClasses = classNames(
      'form-group': true,
      'has-error': !this.state.valid
    );

    if (_.contains(['text', 'email', 'password'], this.props.type)) 
      formElement = (
        <div className=groupClasses>
          <label
            className=labelClasses
            htmlFor=this.props.id>
            this.state.invalidMessage ?
              this.state.invalidMessage : this.props.label
          </label>

          <input type=this.props.type
                 className="form-control"
                 id=this.props.id
                 ref="inputField"
                 onFocus=this.handleFocus.bind(null, true)
                 onBlur=this.handleFocus.bind(null, false)
                 onChange=this.handleChange
                 disabled=this.props.disabled />
        </div>
      );
     else if (this.props.type === 'submit') 
      formElement = (
        <div>
          <button type="submit"
                  className="btn btn-primary"
                  disabled=this.props.disabled>this.props.label
          </button>
        </div>
      );
    

    return formElement;
  
);

【问题讨论】:

【参考方案1】:

通量模式主要用于处理服务器和组件之间的数据。我还使用 app.store 处理影响多个组件的状态,使用 api.store 处理处理服务器 api 的操作(请求或保存数据)。

如果状态的范围仅涉及单个组件,那么您可以将状态包含在组件内。

【讨论】:

以上是关于掌握 React 中 Flux 背后的理论的主要内容,如果未能解决你的问题,请参考以下文章

主动降噪背后的理论是啥?

elasticsearch相关性打分背后的理论

[Elasticsearch] 控制相关度 - 相关度分值计算背后的理论

全球第一批25个GPT模型开始自由生活

学习理论有什么用?

独家 | 支持向量机背后的数学 -对于SVM背后的数学和理论解释的快速概览及如何实现