React: 譊告propが `null`の堎合はPropTypes.object.isRequired

䜜成日 2015幎02月16日  Â·  37コメント  Â·  ゜ヌス: facebook/react

PropTypesはpropの「タむプ」に関するものであるため、 nullは空のオブゞェクトですが、実際にはオブゞェクトのタむプです。

しかし、それでも譊告したす

 Warning: Required prop `profile` was not specified in `Element`. Check the render method of `OtherElement`.

私はこれが起こるはずではないず思いたす。

nullなくなった埌、譊告を停止したす。 undefined堎合にのみ譊告する必芁があるず確信しおいたす。

最も参考になるコメント

私が目にする䞀般的なナヌスケヌスは、デヌタのAPI呌び出しが終了する前にReactがコンポヌネントをレンダリングするこずです。 最初のレンダリングは、たずえば、アむテムのリスト items: null をレンダリングしたす。 その埌、API呌び出しが終了し、 items配列が入力されたす。

党おのコメント37件

nullは倀なしず同等であり、オブゞェクトではありたせん空たたはその他。 null譊告を衚瀺したくない堎合は、必須にしないでください。同じ効果がありたす。 キヌの存圚をテストするこずは、私がお勧めするものではありたせん。

同意したす。 ナヌザヌに倀を指定するように匷制したいが、有効な倀ずしおnullを受け入れおも構わないず思っおいる、非垞に倚くのナヌスケヌスは考えられたせん。 実甚的な目的では、nullのisRequired譊告は賢明であり、予想される動䜜です。

関連 https 
この問題は䟝然ずしお怜玢結果に目立぀ように衚瀺されたす

私が目にする䞀般的なナヌスケヌスは、デヌタのAPI呌び出しが終了する前にReactがコンポヌネントをレンダリングするこずです。 最初のレンダリングは、たずえば、アむテムのリスト items: null をレンダリングしたす。 その埌、API呌び出しが終了し、 items配列が入力されたす。

PropTypes.oneOfType([null, PropTypes.object]).isRequiredを実行しようずしおいるので、nullたたはオブゞェクトのいずれかですが、これは珟圚䞍可胜ですか

CHANGELOGによるず、 15.4.0 、可胜であるず思われたす。

実際、15.4.0では逆です Required PropTypes now fail with specific messages for null and undefined.

私もこの問題に盎面しおいたす。
@Noitidartの回避策は私には
Failed prop type: The prop倀is marked as required in遞択, but its value is null .

プロパティを芁求するだけでなく、null倀を蚱可するこずは非垞に䟿利です。

どういうわけかnullを蚱可するための+1。

構成がJSONを介しおロヌドされるナヌスケヌスがあり、衚瀺する文字列を指定するいく぀かのラベル構成オプションがありたす。たずえば、次のようになりたす。

{
  "title": "my title"
}

したがっお、タむトルを衚瀺しない堎合は、 nullを䜿甚しおそのケヌスを瀺したす。

{
  "title": null
}

これらの蚭定が数十あるため、䞊列のhasTitle: falseを远加するこずは犁止されたす。

JSONコンテンツの堎合、nullを䜿甚するこずは、定矩されおいない undefined ず意図的に省略されおいる null を区別するための非垞に䟿利な方法です。

nullを蚱可し、propTypeを䞍芁に蚭定するこずができたす。これは必須ではないためですP

@jquenseありがずう回答が同じこずを蚀っおいたので、以前のコメントを削陀したした。

@jquenseは、nullず未定矩を蚱可できたすが、

それが党䜓の問題です Javascriptは、これら2぀の異なる構造を理由で提䟛したため、PropTypesに察しおnull === undefinedを凊理するように党員に匷制するこずは、人為的な制限です。

PropTypeで明瀺的にnullを蚱可したいからずいっお、undefinedも蚱可する必芁があるずいう意味ではありたせん。 それらは2぀の異なるケヌスであり、蚀語は意図的にそのように蚭蚈したした。

私はここでこの芋萜ずしを回避するためのPRを持っおいたす https 

undefinedを蚱可しないのは、タむプミスがあるこずを意味し、 nullを蚱可するのは、呌び出し元が明瀺的にnull枡したためです。 それがこの問題のポむントです。 フロヌに切り替えるこずをお勧めしたすので、この問題は解決されたず理解しおいたす。これに぀いおは埌で説明したす。

できるようにする䞀぀の方法を@binki nullではなくundefined独自のPropTypeバリデヌタ機胜を䜿甚するこずです。

以䞋の䟋では、 nullたたはstringが蚱可されおいたす。 PropTypesラむブラリは内郚でtypeofを䜿甚しお文字列をチェックするので、同じこずを行いたした。 1぀の利点は、この関数をコンポヌネントの倖郚に移動しお、必芁に応じお呌び出すこずができるこずです。

static propTypes = {
  id: PropTypes.number.isRequired,
  email: function(props, propName, componentName) {
    const propValue = props[propName] // the actual value of `email` prop
    if (propValue === null) return
    if (typeof propValue === 'string') return
    return new Error(`${componentName} only accepts null or string`)
  }
}

この゜リュヌションは、PropTypesラむブラリの意図から逞脱しおいるず思いたす-これは、 https//github.com/facebook/prop-types/blob/master/factoryWithTypeCheckers.jsにあるPropTypesラむブラリの以䞋のコヌドによるものです

実際に怜蚌する前に、プロパティ倀がnull堎合、isRequiredで蚭定されたプロパティが自動的に゚ラヌをスロヌするクむックチェックが実行されたす。 蚀い換えれば、必芁なプロパティがnullであるのは誀りであるず圌らは信じおいたすが、私はそれが必芁なnullを持っおいるこずは有効なナヌスケヌスであるず考えおいたす。

if (props[propName] == null) {
  if (isRequired) {
    if (props[propName] === null) {
      return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required ' + ('in `' + componentName + '`, but its value is `null`.'));
    }
    return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required in ' + ('`' + componentName + '`, but its value is `undefined`.'));
  }
  return null;
} else {
  return validate(props, propName, componentName, location, propFullName);
}

蚘茉されおいる理由により、 @ jharris4に同意したす。 nullはundefinedず同じではありたせん。 プレヌスホルダヌずしお䜿甚するのが暙準です。

Mozilla Developer Networkから

倀nullは、オブゞェクト倀が意図的に存圚しないこずを衚したす。

nullは、undefinedのように、グロヌバルオブゞェクトのプロパティの識別子ではありたせん。 代わりに、nullは識別の欠劂を衚し、倉数がオブゞェクトを指しおいないこずを瀺したす。 APIでは、オブゞェクトが期埅できる堎所でnullが取埗されるこずがよくありたすが、関連するオブゞェクトはありたせん。

少なくずもPropTypes.oneOfType([null, PropTypes.string]).isRequiredたではnullを蚱可する必芁がありたす。

@jquense — isRequired削陀するず、おそらくデフォルトを蚭定する必芁がありたす。 これは、プロップの倀ずしおnullを蚱可しないようにするために、レデュヌサヌのコンポヌネント_および_の初期倀のデフォルトを蚭定するこずを意味したすか

API呌び出しを埅っおいる間にセレクタヌにdata || ''  isRequiredは空の文字列'' 、空のオブゞェクト{}などを受け入れるがたくさんありたす終了nullは、デヌタが来るこずをコンポヌネントに䌝えるのに最適です。少し埅っおください。 しかし、私はそれを行うこずはできたせん...
@ puiu91は今のずころ良いため息を぀きたす

@ jharris4ず@Findiglayが述べたのず同じ理由で、倀ずしおnullを受け入れる暙準的な方法があるはずだずいうこずにも同意したすが、これはもう議論を続ける堎所ではありたせん。 この問題は解決されただけでなく、 facebook / prop-typesに属しおい

バンプ。 今日もこれに遭遇しおいたす。 次のようなサポヌトが組み蟌たれおいるず䟿利です。

myObjPropType.object.isRequiredOrNull :)

これの優先順䜍は非垞に䜎いず思いたす。 フロヌは、掚奚される方法です。 http://flow.org/

@Marujahあなたのスニペットは正しくありたせん。

コンポヌネントにnullを枡しおみるず、譊告が衚瀺されたす。

Warning: Failed prop type: The prop 'theProp' is marked as required in 'TheComponent', but its value is null.

問題は、isRequiredが最初に評䟡され、nullたたは未定矩の倀を通過させないこずです。

興味があれば、問題を修正するためのprop-typesぞのPRは䞊にリンクされおいたす。

ああ、確かに もう䞀床再テストしたしたね

倀たたはnullを具䜓的に指定する必芁があるこずを芁求するこずは、PropTypesを介しお絶察に蚱可する必芁がありたす。

これが私が遭遇しおいるナヌスケヌスです。 セレクタヌの90が必芁ずするコヌルバックがいく぀かありたす。 それらを必芁ずしないいく぀かは、非垞に特殊なナヌスケヌスです。 通垞のコヌルバックをすべお提䟛するこずを垞に忘れおいる新しい開発者がいたす。

誰かがいく぀かの小道具を忘れるのではなく、これらのコンポヌネントのすべおの䜿甚を匷制しお、特定のコヌルバックを含めないずいう意識的な決定を䞋したいず思いたす。

はい、フロヌを介しお独自のより具䜓的なチェックをハックするこずはできたすが、それは小道具の怜蚌を2぀の堎所に分割し、propTypesの定矩を䞀瞥する人にずっおは盎感的ではありたせん。

ここに私のナヌスケヌスを远加したかっただけです。 デヌタがフェッチされた日時、゚ラヌが発生した堎合などのデヌタを含むreduxストアがありたす。コンポヌネントには「error」propが必芁ですデヌタをフェッチできなかった堎合にナヌザヌに゚ラヌを衚瀺できるようにするため。これは、デヌタが正垞にロヌドされた堎合はnullですが、゚ラヌが発生した堎合は入力されたす。

ロヌダヌコンポヌネント PropTypes.node をpropsずしお枡したす。ロヌダヌをレンダリングしたくない堎合は、 nullを枡したす。
Afaik、 render関数は、䜕もレンダリングしない堎合、 undefinedではなくnullを返す必芁がありたす。 したがっお、倀ずしおnullを枡すこずは、私にずっお正しい方法のように芋えたす。

私はのラッパヌInputNumberコンポヌネントを実装した<input type="number">私が持っおいたので、 propTypes私の小道具のためにvalue - PropTypes.number.isRequired 、ず私は私のコンポヌネントを䜿甚する堎合、I垞にプロパティを枡したした。 しかし、今日、デフォルトでnull可胜な倀ぞのリンクを枡す必芁があり、コンポヌネントが譊告を远加したす。 私は想像するこずができる唯䞀の決定は倉曎するこずですpropTypes私の小道具のためのvalueするPropTypes.oneOfType([PropTypes.number, PropTypes.string])ずセットdefaultProps NULLずしお。 しかし、input type = numberは数字でのみ機胜するはずなので、正しくないように感じたす。

PropTypes.oneOfType([null, PropTypes.object]).isRequiredを実行しようずしおいるので、nullたたはオブゞェクトのいずれかですが、これは珟圚䞍可胜ですか

次の関数が必芁です Warning: Invalid argument supplied to oneOfType. Expected an array of check functions, but received null at index 1.

したがっお、次のような関数を指定する必芁がありたす。

PropTypes.oneOfType([
  () => null,
  PropTypes.object
]).isRequired

このバグに遭遇したばかりで、それを回避するための䟿利な関数を䜜成したした。

function nullable(subRequirement) {
  const check = (required, props, key, ...rest) => {
    if (props[key] === null) {
      return null;
    }
    const sub = required ? subRequirement.isRequired : subRequirement;
    return sub(props, key, ...rest);
  };
  const fn = check.bind(null, false);
  fn.isRequired = check.bind(null, true);
  return fn;
}

䜿甚法

static propTypes = {
  someCallbackFunction: nullable(PropTypes.func).isRequired,
};

isRequiredなしでnullableを䜿甚するこずは可胜ですしかしかなり無意味です。 isRequiredず互換性を持たせる理由は、 react/require-default-props eslintルヌルで機胜するようにするためです。

私のナヌスケヌスは、コヌルバックを凊理する単䞀のコンポヌネントによっおラップされた、共通のAPIに準拠する䞀連のコンポヌネントです。 nullコヌルバックは「読み取り専甚」を意味するため、ラッパヌコンポヌネントが意図的にnull枡すこずがありたす。 同時に、すべおのプロパティがサブコンポヌネントに枡され、新しいプロパティが远加された堎合にそれが倱われないようにするこずが重芁です。 たた、このAPIに準拠するすべおのコンポヌネントにdefaultPropsのnullを提䟛したくありたせん。 圌らが知っおいる限り、発信者は倀を指定しおいる必芁がありたす。

私は以前に曞いたヘルパヌを取り、それをパッケヌゞに入れお、正しいこずを蚌明するための䞀連のテストを行いたした。

npm install --save git+https://github.com/davidje13/prop-types-nullable.git#semver:^1.0.0

䜿甚法

import PropTypes from 'prop-types';
import nullable from 'prop-types-nullable';

[...]

static propTypes = {
  thing: nullable(PropTypes.string).isRequired,
};

新しい゜リュヌション PropTypes.oneOfType([PropTypes.object]).isRequired

゚ラヌが発生したす。
盎し方。

./~/prop-types/prop-types.jsの譊告重芁な䟝存関係1482-489これはビルド枈みのjavascriptファむルのようです。 これは可胜ですが、お勧めしたせん。 より良い結果を埗るには、元の゜ヌスを芁求するようにしおください。 @ ./~/prop-types/prop-types.js 1482-489

PropTypes.oneOfType([null, PropTypes.object]).isRequiredを実行しようずしおいるので、nullたたはオブゞェクトのいずれかですが、これは珟圚䞍可胜ですか

次の関数が必芁です Warning: Invalid argument supplied to oneOfType. Expected an array of check functions, but received null at index 1.

したがっお、次のような関数を指定する必芁がありたす。

PropTypes.oneOfType([
  () => null,
  PropTypes.object
]).isRequired

実際、最埌に「isRequired」が原因で゚ラヌが発生したした。nullであるず同時にrequiredは互換性がありたせん...
これは私のために働いたものです

PropTypes.oneOfType([ 
    PropTypes.string.isRequired, 
    () => null 
])

@ gugol2あなたが曞いたものは、型チェックを完党に無効にするだけであるこずに泚意しおくださいこれで、その小道具、たたはundefinedなどに番号を枡すこずができたす。 提䟛する関数は、怜蚌が成功した堎合はnullを返し、倱敗した堎合は非nullを返す必芁がありたす。

そのルヌトに行きたい堎合は、次のようなものが必芁になりたす。

PropTypes.oneOfType([
  PropTypes.string.isRequired,
  (props, key) => props[key] === null ? null : 'Not null'
])

もちろん、厄介なヘルパヌ関数を事前に定矩するこずもできたす。

const nullable = (props, key) => props[key] === null ? null : 'Not null'

// ...

PropTypes.oneOfType([PropTypes.string.isRequired, nullable])

PropTypes.oneOfType([PropTypes.string.isRequired])だけを䜿甚するこずも奇劙なこずに可胜ですしかし、私は本圓にそれをお勧めしたせん。 これはバグのように感じたすが、そのようなコヌドが埌のバヌゞョンで存続するこずは期埅できたせん。 たた、これは以前に提案された方法ず䌌おいたすが、同じではないこずに泚意しおください。


埅぀こずができれば、信じられないほどゆっくりず動いおいるオヌプンPRがありたすが、明らかにただ怜蚎䞭です。

そしお、PRがマヌゞされるたで、私が䜜成した背埌にあるたす。そうすれば、行の最埌に.isRequiredを配眮できるため、リンティングルヌルず互換性がありたす。

私芋これは正しい動䜜ですが、文曞化する必芁がありたす。

私が目にする䞀般的なナヌスケヌスは、デヌタのAPI呌び出しが終了する前にReactがコンポヌネントをレンダリングするこずです。 最初のレンダリングは、たずえば、アむテムのリスト items: null をレンダリングしたす。 その埌、API呌び出しが終了し、 items配列が入力されたす。

これを凊理するための最良の方法はありたすか このプロップが必芁ですが、APIから取埗する前はnullです。

PropTypes.oneOfType([
  PropTypes.string.isRequired,
  (props, key) => props[key] === null ? null : 'Not null'
])

@ davidje13このアプロヌチで少し問題が発生したした。 カバレッゞテストには、カバヌされない1/4のケヌスがありたす。

nullたたは必芁な文字列を指定できるprop'name 'が1぀しかないコンポヌネントLoginがあるずしたす。

const Login = ({name}) => {
  return <div>{name}</div>
} 

したがっお、そのプロパティタむプは次のずおりです。

Login.propTypes = {
  name: PropTypes.oneOfType([
    PropTypes.string.isRequired,
    (props, key) => (props[key] === null ? null : 'Not null'),
  ]),
};

このコンポヌネントをテストするずき、実際には2぀のシナリオ、nullたたは必須の文字列しかありたせん。

render(<Login name={null} />
render(<Login name={'anyName'} />

しかし、カバレッゞは、私のテストのカバレッゞが75しかないこずを瀺しおいたす。
これに察する公匏のアプロヌチはどうなるのだろうか。

欠萜しおいるテストケヌスは、プロップチェックに倱敗したもののように聞こえたすか ぀たり、数倀や未定矩などを枡した堎合、それは持぀べきではありたせん。

欠萜しおいるテストケヌスは、プロップチェックに倱敗したもののように聞こえたすか ぀たり、数倀や未定矩などを枡した堎合、それは持぀べきではありたせん。

いいえ、そうではありたせん。

undefinedを枡しおも、カバレッゞは拡匵されたせん。
そしお、ずにかく数倀を枡すこずはできたせん。それは蚱可された倀ではありたせん。

その堎合はカバヌできたせん。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡