ReactJS:如何更加模块化地使用对象的道具类型和形状?

dmo*_*oly 14 javascript modularity reactjs

我喜欢为每个班级明确指定我所有的道具类型.

React.createClass({
  propTypes: {
    optionalArray: React.PropTypes.array,
    optionalBool: React.PropTypes.bool,
...
Run Code Online (Sandbox Code Playgroud)

这是从阅读可重用的组件:https://facebook.github.io/react/docs/reusable-components.html

但是,如果我在很多类中使用了一个非常常见的对象,该怎么办?例如:

var MemoryForm = React.createClass({
  propTypes: {
    memory: React.PropTypes.shape({
      memoryID: React.PropTypes.number,
      content: React.PropTypes.string,
      date: React.PropTypes.object,
      dateStr: React.PropTypes.string,
      note: React.PropTypes.string
    }).isRequired,
    ...

var MemoriesArea = React.createClass({
  propTypes: {
    // The initial memory to fill the memory form with.
    formMemory: React.PropTypes.shape({ // <== shape used again
      memoryID: React.PropTypes.number,
      content: React.PropTypes.string,
      date: React.PropTypes.object,
      dateStr: React.PropTypes.string,
      note: React.PropTypes.string
    }).isRequired,
    // ...



var Playground = React.createClass({
  getInitialState: function() {
    var initVars = {
      // The initial memory to fill the memory form with.
      formMemory: {  // <== shape is used again.
        memoryID: 0,
        content: "",
        date: null,
        dateStr: "",
        note: ""
      }
    };
    return initVars;
  }
  //...
Run Code Online (Sandbox Code Playgroud)

在这里,我在各种类的prop类型中以及在一些初始化中经常使用"memory"形状.如何使这更干燥 - 即减少代码重复,这样对象形状的变化将来会更加可维护?

And*_*ous 23

我有同样的问题,只是将值移动到一个单独的ES6模块.在你的例子中:

// File lib/PropTypeValues.js
import { PropTypes } from 'react';

export let MemoryPropTypes = PropTypes.shape({
  memoryID: PropTypes.number,
  content: PropTypes.string,
  date: PropTypes.object,
  dateStr: PropTypes.string,
  note: PropTypes.string
}).isRequired
Run Code Online (Sandbox Code Playgroud)

然后在您的客户端代码中:

// MemoryForm.jsx
import { MemoryPropTypes } from './lib/PropTypeValues'
import React from 'react';

class MemoryForm extends React.Component {
  static propTypes: {
    memory: MemoryPropTypes,
    // ...
  };
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.


And*_*ahl 4

我会制作一个小模块来公开该功能。在 CommonJS 世界中它看起来像这样:

let React = require('react');

module.exports = {
  propTypes() {
    return React.PropTypes.shape({
      memoryID: React.PropTypes.number,
      content: React.PropTypes.string,
      date: React.PropTypes.object,
      dateStr: React.PropTypes.string,
      note: React.PropTypes.string
    }).isRequired;
  },
  initialValues() {
    return {
      memoryID: 0,
      content: "",
      date: null,
      dateStr: "",
      note: ""
    };
  }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以在像这样的组件中使用它:

let memoryUtils = require('./memory-utils');

let MyComponent = React.createClass({
  propTypes: memoryUtils.propTypes(),
  render() {
    ...
  }
});
Run Code Online (Sandbox Code Playgroud)

和:

let memoryUtils = require('./memory-utils');

let MyComponent = React.createClass({
  getInitialState() {
    return memoryUtils.initialValues();
  },
  render() {
    ...
  }
});
Run Code Online (Sandbox Code Playgroud)