私はreact native
に基づいてプロジェクトを書いています。コンポーネントの型チェックにprop-types
を使用しています。ここで、react-native
のImage
コンポーネントを自分のImage
コンポーネントでラップします。次のコードで、私自身のImage
コンポーネントを参照してください。
import React from 'react';
import { Image as ImageNative } from 'react-native';
import PropTypes from 'prop-types';
const Image = ({ style, source }) => (
<ImageNative source={source} style={style} />
);
Image.defaultProps = {
style: {}
};
Image.propTypes = {
style: PropTypes.oneOfType([PropTypes.object, PropTypes.array]),
source: PropTypes.any.isRequired
};
export default Image;
独自のImage
コンポーネントを使用することにした場所ごとに、それをインポートして次のように使用します。
<Image source={require('assets/images/splashSignInAsset.png')} />
実際、私は自分のsource
コンポーネント内のImage
propをanyとしてチェックしました。
source: PropTypes.any.isRequired
しかし、それは真実ではありません。私はそれを知っている。そこに何を書けばいいのかわからない。ここで確認したrequire
関数の戻り値のタイプは何ですか?
実際、私はany
の使用を拒否しています。良い答えはnode
です。
Image
コンポーネント内にrequire('assets/images/splashSignInAsset.png')
関数を挿入するときは、次のようにnode
プロパティタイプを確認する必要があります。
Image.propTypes = {
style: PropTypes.oneOfType([PropTypes.object, PropTypes.array]),
source: PropTypes.node.isRequired
};
しかし、正しい答えは、source
にReact Native
コンポーネントの小道具タイプを使用することだと思います。
import { Image as ImageNative } from 'react-native';
...
Image.propTypes = {
style: PropTypes.oneOfType([PropTypes.object, PropTypes.array]),
source: ImageNative.propTypes.source.isRequired
};
また、正確な答えはreact-native
ソースコードでsource
propタイプを使用しているため、最良の答えは次のコードのようになります。
source: PropTypes.oneOfType([
PropTypes.shape({
uri: PropTypes.string,
headers: PropTypes.objectOf(PropTypes.string)
}),
PropTypes.number,
PropTypes.arrayOf(
PropTypes.shape({
uri: PropTypes.string,
width: PropTypes.number,
height: PropTypes.number,
headers: PropTypes.objectOf(PropTypes.string)
})
)
])
まず、次のようにImage
をインポートします。
import { Image as ImageNative } from 'react-native';
そして、次のようにImage
定数を定義します。
const Image = ({ style, source }) => (
コンポーネントに別の名前を適用するか、別の名前でインポートする必要があります。
ここで、クエリに対して、次のようなソースを使用しないでください。
source={require('assets/images/splashSignInAsset.png')}
代わりに、次のようなソースを提供してください。
source={'splashSignInAsset.png'}
また、コンポーネントで、requireとpathを適用します。また、string
またはcustomProp
を使用してcheckと入力すると、png
、jpg
などの拡張子をテストできます。
const imgSource = `assets/images/${source}`;
<ImportedImageName source={require(imgSource)} style={style} />
YourImageComponent.propTypes = {
source: PropTypes.string.isRequired
}
または、カスタム小道具:
source: function(props, propName, componentName) {
if (!/.(jpg|jpeg|png|gif)$/i.test(props[propName])) {
return new Error(
'Invalid prop `' + propName + '` supplied to' +
' `' + componentName + '`. Validation failed.'
);
}
},