2014-12-31 23 views
1

使用React v0.12 @jsx編譯指示消失了,這意味着不能再使用React.METHODNAME語法以外的任何其他輸出方式輸出jsx。使用jsx語法輸出除React以外的對象名稱

對於我的使用情況下,我試圖總結在另一個對象作出反應的對象,從而提供一些方便的方法,在我的組件文件,我希望能寫:

var myConvenienceObject = require('React-Wrapper'); 
var Component = myConvenienceObject.createSpecializedClass({ 
    render: function() { 
    return <div /> 
    } 
}) 

然而JSX編譯自動將<div />轉換爲React.createElement("div", null)

使用舊版本的React可以使用文件頂部的編譯指示來處理此問題。然而,由於已經被刪除,我想知道是否有目前沒有辦法更改的JSX編譯,以便<div />將被轉換的對象的名稱爲myConvenienceObject.createElement("div", null)

回答

0

不,它不再可能使用JSX定製的前綴。如果你需要這樣做,你需要修改JSX轉換代碼,或者創建一個假的React。

var React = require('react'), FakeReact = Object.assign({}, React, { 
    createElement: function(component, props, ...children){ 
     // ... 

     // eventually call the real one 
     return React.createElement(component, props, ...children); 
    } 
}); 
module.exports = FakeReact; 

然後使用它導入假反應並將其稱爲React。

var React = require('fake-react'); 

// ... 
    render: function(){ return <div />; } 
+0

非常感謝您的信息!我想人們只需要記住在「React」中需要 –

0

如果你想使某些元素包含在你的myConvenienceObject ,你可以考慮children道具,如doc所示。但是這也可能需要在myConvenienceObject的一些變化,接受孩子。

順便說一句,我不知道這是哪裏createSpecializedClass功能的來源和它做什麼

+0

對不起,我是不是它更加清晰'createSpecializedClass'只是各地的標準'React.createClass'方法的包裝的一個例子。不幸的是,我不認爲你的建議在這種情況下會起作用,因爲我仍然無法在組件文件本身中使用jsx。 –

+0

會很好,如果你可以在這裏粘貼一些代碼片段。兒童道具也可以是jsx,不僅限於字符串 – ChinKang