Như đã đề cập bởi những người khác, điều này có lẽ là một ý tưởng khủng khiếp, nhưng trong châm ngòi của "bất cứ điều gì là có thể", ở đây nó đi.
Trước tiên, chúng tôi cần xác định giao diện để thử nghiệm giá đỡ. Nó hoàn toàn linh hoạt, với một mặc định thuận tiện.
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;
}
});
}
Một ví dụ về những gì bạn muốn vượt qua đó là {foo: true, bar: odd}
lợi nhuận nơi lẻ đúng nếu một số là số lẻ. Khi được gọi với <Component foo={true} bar={7} />
mixin sẽ là 'hoạt động'.
Sử dụng điều đó, chúng tôi có thể xác định hàm có một mảng là {mixin: mixin, condition: tests}
, trong đó các thử nghiệm có định dạng nói trên.
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;
}
Bây giờ chúng ta có thể xác định mixins của chúng tôi như sau:
mixins: [conditionalizeMixins([
{
mixin: myMixin,
condition: {foo: true, bar: false}
},
{
mixin: myMixin,
condition: {foo: false, num: function(x){return x%2===1}}
}
])]
Xem nếu có một cách để chia thành hai thành phần, chứ không phải là một thành phần duy nhất. Đó có thể là cách tốt nhất để giải quyết vấn đề này.
Thuyết minh về đoạn code trên:
- hiệu suất là không lớn, nhưng có thể được tối ưu hóa
- nếu nhiều mixins có điều kiện xác định, ví dụ như, getInitialState, chỉ có một hoạt động cuối cùng được sử dụng
- nó ẩn lỗi, vd nếu bạn xác định doFoo mà trả về một chuỗi, và không ai trong số các mixins đang hoạt động, nó sẽ âm thầm trở lại không xác định
jsbin
này trông giống như một ứng cử viên chính để làm cho hai thành phần. Tôi đồng ý bạn không muốn nhiều điều kiện đi trong một thành phần - thường là rất nhiều điều kiện xung quanh một hoặc hai giá trị của một prop trung tâm là một chỉ báo tốt rằng các thành phần có thể được refactored và phân chia để làm cho đơn giản hơn. –
Âm thanh như bạn đã có lệnh prop: cách xác định hàm xác định thành phần với giá trị tham số, tính toán danh sách 'mixins' đầu tiên trong phần tử" thành phần xác định "sau đó chuyển kết quả hàm của bạn tới 'react.renderComponent'? Ví dụ. 'phản ứng.renderComponent (componentDefiningFunc (prop), yourTarget) ' –