支持oneOf数组或React.js中的默认值

Gui*_*ent 2 javascript reactjs

我想在数组中使用prop创建一个组件或使用默认值:

<Component lang="en"/> // this.props.lang == en
<Component lang="fr"/> // this.props.lang == fr
Run Code Online (Sandbox Code Playgroud)

我的组件尚未翻译成意大利语,因此<Component lang="it"/>显示警告信息:

Warning: Failed prop type: Invalid prop `lang` of value `it` supplied to `Component`, expected one of ["en","fr"].
Run Code Online (Sandbox Code Playgroud)

我组件的语言等于it,我想等于en。任何的想法 ?

import React from 'react';

const Component = React.createClass({
  propTypes: {
    lang: React.PropTypes.oneOf(['en', 'fr'])
  },
  getDefaultProps() {
    return {
      lang: 'en'
    };
  },
  render(){
    return (
      <h1>
        lang: {this.props.lang}
      </h1>
    );
  }
});

export default Component;
Run Code Online (Sandbox Code Playgroud)

这是我的测试:

import assert from 'assert';

import React from 'react';
import {mount} from 'enzyme';

import Component from './Component';

describe('<Component />', () => {
  it('get default prop', () => {
    const wrapper = mount(<Component />);
    assert.equal(wrapper.prop('lang'), 'en') // pass
  });
  it('get valid prop', () => {
    const wrapper = mount(<Component lang="fr"/>);
    assert.equal(wrapper.prop('lang'), 'fr') // pass
  });
  it('get invalid prop', () => {
    const wrapper = mount(<Component lang="it"/>);
    assert.equal(wrapper.prop('lang'), 'en') // fail
  });
});
Run Code Online (Sandbox Code Playgroud)

Mat*_*ins 5

React提供的prop验证实际上是用于开发中的调试,而不是用于生产。

对于您要实现的目标,您应该构建一个自定义的辅助方法,以在不期望的情况下转换该值。

import React from 'react';

const VALID_LANGS = ['en', 'fr'];

const Component = React.createClass({
  propTypes: {
    lang: React.PropTypes.oneOf(VALID_LANGS)
  },
  getDefaultProps() {
    return {
      lang: 'en'
    };
  },
  render() {
    return (
      <h1>
        lang: {this.getLang()}
      </h1>
    );
  },
  getLang() {
    return VALID_LANGS.indexOf(this.props.lang) !== -1 ? this.props.lang : VALID_LANGS[0];
  }
});

export default Component;
Run Code Online (Sandbox Code Playgroud)

不过,由于无法检查道具是否正确,因此您需要更新测试。取而代之的是,您需要检查输出是否符合期望,或者用正确的“ en”属性值渲染子组件。