回答
React.Component
是一個普通的javascript函數,因爲es6類是圍繞它們的語法糖。所以我們可以使用我們喜歡的任何es5類概念,我只是借用骨幹extend
方法在這裏:
// From backbone
var extend = function(protoProps) {
var parent = this;
var child;
var extendObj = function(obj1, obj2) {
for (var i in obj1) {
if (obj1.hasOwnProperty(i)) {
obj2[i] = obj1[i];
}
}
};
// The constructor function for the new subclass is either defined by you
// (the "constructor" property in your `extend` definition), or defaulted
// by us to simply call the parent constructor.
if (protoProps && hasOwnProperty.call(protoProps, 'constructor')) {
child = protoProps.constructor;
} else {
child = function() { return parent.apply(this, arguments); };
}
// Set the prototype chain to inherit from `parent`, without calling
// `parent` constructor function.
var Surrogate = function(){ this.constructor = child; };
Surrogate.prototype = parent.prototype;
child.prototype = new Surrogate;
// Add prototype properties (instance properties) to the subclass,
// if supplied.
if (protoProps) extendObj(child.prototype, protoProps);
// Set a convenience property in case the parent's prototype is needed
// later.
child.__super__ = parent.prototype;
return child;
};
React.Component.extend = extend;
然後,我們可以創建一個組件是這樣的:
var MyComponent = React.Component.extend({
constructor: function() {
console.log('hello from react component');
this.setState({
open: false
});
React.Component.apply(this, arguments);
}
});
new MyComponent();
這只是一個例子(未經測試),你可以做任何一種原型實現,你既然喜歡這只是一個正常的功能。如果您搜索「es5繼承」,您應該可以應用任何這些解決方案。
謝謝,這對於瞭解'React.Component(道具,上下文)'簽名很有用。我還在尋找一種方法來更新'render'方法,例如'render({props,state},setState)',以便在組件中無處不在地討厭'this'。 – Kosmetika
我想我的回答遲到了。但是我使用基於JavaScript的傳統原型對象製作了很多React組件。如果你喜歡基於原型的對象,你可以試試下面的:)
一個簡單的例子:
第1步:安裝inherits
模塊
npm install inherits -S
然後,
const React = require('react'); // switch to import, if you like
const is = require('prop-types');
const inherits = require('inherits');
inherits(MyComponent, React.Component);
module.exports = MyComponent;
var prototype = MyComponent.prototype;
MyComponent.defaultProps = {
onClick: function(){ }
};
MyComponent.propTypes = {
onClick: is.func,
href: is.string,
label: is.string
}
function MyComponent(props) {
React.Component.call(this, props);
this.state = {clicked: false};
}
prototype.render = function() {
return (
<a href={this.props.href} onClick={this.props.onClick}>
{this.props.label}
</a>)
}
// for debugging purpose, set NODE_ENV production, will remove the following
if (process.env.NODE_ENV !== 'production') {
MyComponent.displayName = 'MyComponent';
}
更先進的方法來分離你的擔憂是將你的方法放在不同的文件中。 (通常,保護或私有方法,幾個月或幾年後不需要知道的東西。)然後,將它們合併到原型對象上。你可以通過以下方式來完成。
...
const _proto = require('./prototype'); //make a prototype folder, and merge all files' methods into one.
...
var prototype = Object.assign(MyComponent.prototype, _proto);
或者,你想使你的組件作爲EventEmitter,你可以像下面:
....
const _proto = require('./prototype');
const Emitter = require('component-emitter');
....
var prototype = Object.assign(MyComponent.prototype, _proto, Emitter.prototype);
function MyComponent(props) {
React.Component.call(this, props);
this.onClick = _=> this.emit("click");
}
prototype.render = function() {
return <a href={this.props.href} onClick={this.onClick}>{this.props.label}</a>
}
在原型文件夾,您可以編寫如下:
指數。 JS
Object.assign(exports, require('./styles.js').prototype)
styles.js
const prototype = exports.prototype = {};
prototype.prepareStyles = function() {
var styles = Object.defineProperties({}, {
wrapper: { get: _=> ({
backgroundColor: '#333'
})},
inner: {get: _=> {
return this.state.clicked ? {...} : {...}
}}
});
Object.defineProperties(this, {
styles: {get: _=> styles}
})
}
//All the methods are prefixed by prototype, so it is easy to cut and paste the methods around different files, when you want to hide some methods or move some methods to be with the constructor to make your component more easy to read.
然後,在主文件中。只需調用方法準備的所有樣式:
function MyComponent(props) {
React.Component.call(this, props);
this.prepareStyles();
}
和使用的樣式,
prototype.render = function() {
return (
<div style={this.styles.wrapper}>
<div styles={this.styles.inner}>hello world</div>
</div>
)
}
- 1. 將純JS對象的數組轉換爲Ember.js ArrayController
- 2. Springs MVC JSON響應並將其轉換爲JS對象
- 3. 將響應插入對象數組
- 4. 傳遞子組件vs傳遞純js對象
- 5. 將JSON對象的列表作爲JSON對象進行挖空
- 6. 如何將純JS對象轉換爲Immutable集合?
- 7. combineReader將不可變映射轉換爲純JS對象
- 8. Mono Gtk.Dialog返回對象作爲響應
- 9. 作爲DOM對象的Ajax響應
- 10. 如何當對象作爲響應
- 11. POSTMAN:將對象環境變量與響應對象進行比較
- 12. 承諾並獲得響應對象爲null進行。然後
- 13. 響應節點js中的json對象
- 14. 將對象作爲組件中的支持對象
- 15. Javascript香草ajax將響應轉換爲對象數組?
- 16. 如何將元素編組爲JAXB Axis2響應對象
- 17. 無法將Magento對象數組響應轉換爲json格式
- 18. 將響應NSArray轉換爲對象數組swift3
- 19. Json對JS數組的響應
- 20. 將本機js事件對象轉換爲jQuery事件對象
- 21. 從xml響應提取對象數組js
- 22. 將響應結果作爲數組而不是網絡服務中的對象
- 23. 將子組件作爲子對象作爲屬性
- 24. 將grails域對象轉換爲JSON並對其進行操作
- 25. 將json對象作爲json-rpc響應結果返回
- 26. 如何響應文件流和json對象作爲Web API的單一響應
- 27. 響應對象
- 28. 將JS對象作爲範圍傳遞給JS模板文字?
- 29. Sweet.js:可能將JS對象擴展爲JS對象?
- 30. 將AngularFire的firebaseListObservable對象轉換爲純文本對象
'React.Component'是一個普通的JavaScript函數,因爲ES6只是語法糖 - 簽名是'功能ReactComponent(道具,背景)' –
這裏有點不清楚你的意思。你的意思是代碼通過jsx和es6轉譯器運行後的JavaScript最終結果? – fraxture