ある小道具のデフォルト値が別の小道具の値に依存するコンポーネントがあります(デフォルトまたはユーザー提供)。 this
にアクセスできないため、次のことはできません。
static defaultProps = {
delay: this.props.trigger === 'hover' ? 100 : 0,
trigger: 'hover'
};
どうすればこれを行うのが最善ですか?
私はむしろあなたに次のことを提案したいと思います:
ちなみに、どちらの場合も、新しい小道具がコンポーネントに到着するタイミングを確認し、必要に応じて更新する必要があります。
状態変数を取得して、次のように記述します。
class MyComponent extends React.Component {
static propTypes = {
trigger: PropTypes.string,
}
static defaultProps = {
trigger: 'hover',
}
constructor(props) {
super(props);
this.state = {
delay: this.computeDelay(),
}
}
componentWillReceiveProps(nextProps) {
const { trigger: oldTrigger } = this.props;
const { trigger } = nextProps;
if (trigger !== oldTrigger) {
this.setState({
delay: this.computeDelay(),
})
}
}
computeDelay() {
const { trigger } = this.props;
return trigger === 'hover' ? 100 : 0;
}
render() {
...
}
}
このようにして、値を決定することなく、renderメソッドでthis.state.delay
を使用できます。
Renderメソッド内でそれを行うことができます。
render() {
const delay = this.props.trigger === 'hover' ? 100 : 0;
// Your other props
return (
<SomeComponent delay={delay} />
// or
<div>
{/*...something else, use your delay */}
</div>
);
}
関数コンポーネントを使用すると、次のように実行できます。
function MyComponent({
trigger,
delay: trigger === 'hover' ? 100 : 0,
}) {
return <div>...</div>
}
MyComponent.propTypes = {
trigger: PropTypes.string.isRequired,
delay: PropTypes.number.isRequired,
};
私は同様の問題に直面していて、この議論にmethod
ベースの解決策が欠けているのを見つけたので、この答えを書いています
デフォルトの小道具を渡したい場合は2つあります
ケース1:静的値に基づいてdefaultPropsを選択する場合
ケース2:メソッドに基づいてdefaultPropsを選択する場合
Case 1
のソリューション
class Shape extends Component{
static defaultProps = {
colour: 'red',
}
render(){
const {colour} = this.props;
// Colour will always be 'red' if the parent does not pass it as a prop
return <p>{colour}</p>;
}
}
Case 2
のソリューション
class Shape extends Component{
calcArea = () => {
console.log("Area is x");
}
render(){
const {calcArea} = this.props;
// calcArea will be evaluated from props then from the class method
return <button onClick={calcArea || this.caclArea}></button>;
}
}