소품을 기반으로 한 React 구성 요소의 mixin 배열을 만들 수 있습니까?React의 조건부 믹스?
나는 두 가지 값 중 하나를 취할 수있는 받침대가있는 구성 요소가 하나 있습니다. 이것을 바탕으로, 나는 나의 mixins 중 하나에서 근본적으로 다른 행동이 필요합니다. 이 믹스 인을 사방에 괴물 같은 조건문을 쓰는 것보다 두 개의 별개의 파일로 분리하고 싶습니다. 그러나 이것을 쉽게 할 수있는 방법을 찾을 수 없습니다. 어떤 팁?
소품을 기반으로 한 React 구성 요소의 mixin 배열을 만들 수 있습니까?React의 조건부 믹스?
나는 두 가지 값 중 하나를 취할 수있는 받침대가있는 구성 요소가 하나 있습니다. 이것을 바탕으로, 나는 나의 mixins 중 하나에서 근본적으로 다른 행동이 필요합니다. 이 믹스 인을 사방에 괴물 같은 조건문을 쓰는 것보다 두 개의 별개의 파일로 분리하고 싶습니다. 그러나 이것을 쉽게 할 수있는 방법을 찾을 수 없습니다. 어떤 팁?
아니요, 불가능합니다. 더 이상 알지 못한다면 다른 구성 요소를 작성하고 조건부로 부모의 올바른 구성 요소를 사용하는 아이디어를 탐색하려는 것일 수 있습니다. 원하는 경우이를 포장하여 소비자로부터 숨길 수도 있습니다.
그게 내가 피하고 싶었던 것이지만, 가장 좋은 대답 인 것 같습니다. 제 경우에는 다른 구성 요소를 만들지는 않을 것이라고 생각하지만, 아마도 미래의 리팩토링 도구에 포함될 것입니다. 감사. – Bonnie
기본적으로 조건에 따라 별도의 구성 요소를 만드는 것이 좋습니다. 그러나 react-mixin-manager이라는 타사 구성 요소가 있으며 매개 변수를 허용하는 조건 및 믹스 인을 기반으로 동적 믹스를 수행 할 수 있습니다. 그러나 나는 그것을 사용하지 않았기 때문에 그것을 정말로 보증 할 수는 없으며 제작 현장에서 사용하는 것을 권장하지 않지만 그것으로 놀아도 좋다.
다른 사람들이 언급했듯이, 아마도 이것은 아마도 끔찍한 생각이지만, "무엇이든 가능하다"는 말은 여기있다.
먼저 우리는 소품을 테스트하기위한 인터페이스를 정의해야합니다. 편리한 기본 설정으로 완벽하게 유연하게 사용할 수 있습니다.
var hasOwn = Function.prototype.call.bind(Object.prototype.hasOwnProperty);
function testProps(obj, thisArg){
return Object.keys(obj).every(function(propName){
var test = obj[propName], prop = thisArg.props[propName];
if (typeof test === "function"){
return test(prop);
}
else {
return prop === test;
}
});
}
당신이에 전달했던 것과의 예는 숫자가 홀수 인 경우 {foo: true, bar: odd}
홀수 반환 사실이다. <Component foo={true} bar={7} />
으로 전화를 걸면 믹스 인이 '활성'이됩니다.
이것을 사용하여 {mixin: mixin, condition: tests}
의 배열을 취하는 함수를 정의 할 수 있습니다. 여기서 테스트는 앞서 언급 한 형식입니다.
function conditionalizeMixins(mixins){
var proxyMixin = {};
var runMixins = function(lifeCycleKey){
return function(){
var component = this, args = arguments;
var result;
mixins.forEach(function(mixin){
if (testProps(mixin.condition, component)) {
result = mixin.mixin[lifeCycleKey].apply(component, args);
}
});
return result;
}
}
mixins.forEach(function(mixin){
Object.keys(mixin.mixin).forEach(function(key){
if (proxyMixin[key]) return;
proxyMixin[key] = runMixins(key);
});
});
return proxyMixin;
}
이제 우리는과 같이 우리의 유지 mixin을 정의 할 수 있습니다 : 오히려 단일 구성 요소보다 두 가지 구성 요소로이 분할 할 수있는 방법이 있는지
mixins: [conditionalizeMixins([
{
mixin: myMixin,
condition: {foo: true, bar: false}
},
{
mixin: myMixin,
condition: {foo: false, num: function(x){return x%2===1}}
}
])]
을 참조하십시오. 이것이 가능한 가장 좋은 방법입니다. 위의 코드에 대한
주 :
정의되지 않은이 두 가지 구성 요소를 만들기 위해 주요 후보처럼 보인다 돌아갑니다. 컴포넌트 내에서 많은 조건문이 필요하지 않다는 것에 동의합니다. 일반적으로 중앙 소품의 값 중 하나 또는 두 개를 나타내는 많은 조건문은 컴포넌트가 리팩터링되어 더 간단해질 수 있다는 좋은 지표입니다. –
당신은 이미 소품을 가지고있는 것처럼 들리네요 : 소품을 매개 변수로 사용하여 구성 요소를 정의하는 함수를 정의하고,이 "구성 요소 정의"기능 본문에서 우선적으로 'mixins'목록을 계산 한 다음에 함수의 결과를 'react.renderComponent'? 예 : '반응한다.renderComponent (componentDefiningFunc (prop), yourTarget)' –