どのようにVueの中でJSXを書きます
15764 ワード
概要
demoプロジェクトの作成
デフォルトの
JSXを書く
最も簡単な例から、templateバージョンとrender関数バージョンの
render関数バージョン
サードパーティ製ライブラリの使用 を用いる.
templateバージョン
render関数バージョン
グローバルにロードされているため
頭文字は
大文字で、プラグインが認識されます. を用いる.
templateバージョン
render関数バージョン
ほとんどの
templateバージョン
render関数バージョン を用いる.
templateバージョン
render関数バージョン を用いる.
templateバージョン
render関数バージョン
この例は複雑で,主に
転載先:https://juejin.im/post/5bf6ea4df265da611c269ee0
Vue
の完全なtemplate
プログラミング能力は、JavaScript
の代わりにrender関数によって得ることができる.Vue公式サイト上のアンカータイトルの例は、render
関数がいくつかのシーンでコードを効率的に簡略化できることを示している.createElement
関数でrender
関数を記述することができますが、createElement
の書き方は煩雑すぎて、論理が少し複雑になるとコードが山積みになり、読みにくくなります.公式ドキュメントでは、Babelプラグインを使用して、render
関数でJSX
構文を使用して、コードをテンプレート構文に近づけることができます.Babel
変換プラグインの公式ドキュメントでは、JSX
の構文について説明しています.ここでは、 Vue
にJSX
を書く方法について、例に関連して説明します.demoプロジェクトの作成
Vue CLI
でdemoプロジェクトを迅速に作成vue create learn-vue-jsx
デフォルトの
@vue/babel-preset-app
には、JSX
構文を変換するプラグインが含まれています.@babel/plugin-syntax-jsx
babel-helper-vue-jsx-merge-props
babel-plugin-transform-vue-jsx
element-ui
ライブラリを導入し、サードパーティライブラリの使用に関するJSX
の使用法について説明するvue add element
JSXを書く
最も簡単な例から、templateバージョンとrender関数バージョンの
Hello World
templateバージョン
"helloWorld"
:class="{'hello-world': true}"
:style="{'color': 'red'}"
@click="onClick">
{{this.msg}}
<span class="hljs-built_in">export</span> default {
<span class="hljs-function"><span class="hljs-title">data</span></span>() {
<span class="hljs-built_in">return</span> {
msg: <span class="hljs-string">'Hello World'</span>
}
},
methods: {
<span class="hljs-function"><span class="hljs-title">onClick</span></span>() {
alert(<span class="hljs-string">'Hello World'</span>);
}
}
}
render関数バージョン
<span class="hljs-built_in">export</span> default {
<span class="hljs-function"><span class="hljs-title">data</span></span>() {
<span class="hljs-built_in">return</span> {
msg: <span class="hljs-string">'Hello World'</span>
}
},
methods: {
<span class="hljs-function"><span class="hljs-title">onClick</span></span>() {
alert(<span class="hljs-string">'Hello World'</span>);
}
},
<span class="hljs-function"><span class="hljs-title">render</span></span>() {
<span class="hljs-built_in">return</span> (
<p
id=<span class="hljs-string">"helloWorld"</span>
class={{<span class="hljs-string">'hello-world'</span>: <span class="hljs-literal">true</span>}}
style={{<span class="hljs-string">'color'</span>: <span class="hljs-string">'red'</span>}}
onClick={this.onClick}>
{this.msg}
</p>
);
}
}
サードパーティ製ライブラリの使用
element-ui
のel-button
組立体templateバージョン
"medium"
type="primary"
round
loading>
render関数バージョン
render() {
return (
type="primary"
size="medium"
round
loading>
);
}
グローバルにロードされているため
element-ui
ライブラリなので、JSX
で認識可能el-button
コンポーネント.自分で作成したコントロールの場合は、components
にこのコントロールを導入するか、babel-plugin-transform-vue-jsx
ドキュメントで紹介されている、直接render
関数でimportが入ってくるコントロールを使用します.ここで使用するコントロールに注意してください.頭文字は
大文字で、プラグインが認識されます.
import MyButton from './MyButton';
export default {
render() {
return (
);
}
};
element-ui
のel-input
組立体templateバージョン
"input"
placeholder=" ">
{{input}}
render関数バージョン
methods: {
onInput(value) {
this.input = value;
}
},
render() {
return (
" "
onInput={this.onInput}>
{this.input}
);
}
ほとんどの
Vue
の内蔵命令はJSX
ではサポートされていないので、他の方法で実現する必要があります.v-model
命令のように、実はvalue
属性とinput
イベントの構文糖である.v-if
命令はif
文を使用して実装することができ、v-for
命令はarray.map
文を使用して実装することができる.比較例外は、v-show
命令がJSX
で使用できることである.具体例は以下の通りです.templateバージョン
v-if
"isIf">v-if
v-for
"item in list">{{item}}
v-show
"isShow">v-show
render関数バージョン
render() {
return (
v-if
{
this.isIf ? v-if : ''
}
v-for
{
this.list.map((item) => {
return item
})
}
v-show
"isShow">v-show
);
}
element-ui
のel-loading
組立体JSX
でカスタム命令伝達argument
とmodifiers
の書き方は煩雑であり、el-loadingグループ価格の命令方式を例に挙げる.templateバージョン
type="primary"
@click="openFullScreen"
v-loading.fullscreen.lock="fullscreenLoading">
Loading
render関数バージョン
render() {
const directives = [
{
name: 'loading',
value: this.fullscreenLoading,
modifiers: { fullscreen: true, lock: true }
}
];
return (
type="primary"
onClick={this.openFullScreen}
{...{ directives}}>
Loading
);
}
babel-plugin-transform-vue-jsx
公式文書では、Vue
命令を書く別の方法も紹介されていますが、v-loading={this.fullscreenLoading}
という書き方だけが有効であり、argument
やmodifiers
などのパラメータを設定することはできません.element-ui
のel-table
組立体el-table
コンポーネントは、カスタムスロットを使用して、ヘッダーとカスタム列テンプレートをカスタマイズする機能を提供します.具体例は以下の通りです.templateバージョン
"tableData" style="width: 100%">
" " prop="date">
" " prop="name">
"header">
"search" size="mini" placeholder=" "/>
"scope">
"mini" @click="handleEdit(scope.$index, scope.row)">
"mini" type="danger" @click="handleDelete(scope.$index, scope.row)">
<span class="hljs-built_in">export</span> default {
<span class="hljs-function"><span class="hljs-title">data</span></span>() {
<span class="hljs-built_in">return</span> {
tableData: [
{
date: <span class="hljs-string">'2016-05-02'</span>,
name: <span class="hljs-string">' '</span>,
address: <span class="hljs-string">' 1518 '</span>
},
{
date: <span class="hljs-string">'2016-05-04'</span>,
name: <span class="hljs-string">' '</span>,
address: <span class="hljs-string">' 1517 '</span>
},
{
date: <span class="hljs-string">'2016-05-01'</span>,
name: <span class="hljs-string">' '</span>,
address: <span class="hljs-string">' 1519 '</span>
},
{
date: <span class="hljs-string">'2016-05-03'</span>,
name: <span class="hljs-string">' '</span>,
address: <span class="hljs-string">' 1516 '</span>
}
],
search: <span class="hljs-string">""</span>
};
},
methods: {
handleEdit(index, row) {
console.log(index, row);
},
handleDelete(index, row) {
console.log(index, row);
}
}
};
render関数バージョン
<span class="hljs-built_in">export</span> default {
<span class="hljs-function"><span class="hljs-title">data</span></span>() {
<span class="hljs-built_in">return</span> {
tableData: [
{
date: <span class="hljs-string">'2016-05-02'</span>,
name: <span class="hljs-string">' '</span>,
address: <span class="hljs-string">' 1518 '</span>
},
{
date: <span class="hljs-string">'2016-05-04'</span>,
name: <span class="hljs-string">' '</span>,
address: <span class="hljs-string">' 1517 '</span>
},
{
date: <span class="hljs-string">'2016-05-01'</span>,
name: <span class="hljs-string">' '</span>,
address: <span class="hljs-string">' 1519 '</span>
},
{
date: <span class="hljs-string">'2016-05-03'</span>,
name: <span class="hljs-string">' '</span>,
address: <span class="hljs-string">' 1516 '</span>
}
],
search: <span class="hljs-string">''</span>
};
},
methods: {
updateSearch(value) {
this.search = value;
},
handleEdit(index, row) {
<span class="hljs-built_in">return</span> () => {
console.log(index, row);
};
},
handleDelete(index, row) {
<span class="hljs-built_in">return</span> () => {
console.log(index, row);
};
}
},
<span class="hljs-function"><span class="hljs-title">render</span></span>() {
<span class="hljs-built_in">let</span> that = this;
<span class="hljs-built_in">return</span> (
<el-table data={this.tableData} style={{ width: <span class="hljs-string">'100%'</span> }}>
<el-table-column label=<span class="hljs-string">" "</span> prop=<span class="hljs-string">"date"</span>></el-table-column>
<el-table-column label=<span class="hljs-string">" "</span> prop=<span class="hljs-string">"name"</span>></el-table-column>
<el-table-column {...{
scopedSlots: {
header: scope => {
<span class="hljs-built_in">return</span> (
<el-input size=<span class="hljs-string">"mini"</span> placeholder=<span class="hljs-string">" "</span> value={that.search} onInput={that.updateSearch}/>
);
},
default: scope => {
<span class="hljs-built_in">return</span> [
<el-button size=<span class="hljs-string">"mini"</span> onClick={that.handleEdit(scope.<span class="hljs-variable">$index</span>, scope.row)}> </el-button>,
<el-button size=<span class="hljs-string">"mini"</span> <span class="hljs-built_in">type</span>=<span class="hljs-string">"danger"</span> onClick={that.handleDelete(scope.<span class="hljs-variable">$index</span>, scope.row)}> </el-button>
];
}
}
}}>
</el-table-column>
</el-table>
);
}
};
この例は複雑で,主に
v-model
命令,役割ドメインスロット,イベントインライン処理などに関する.v-model
命令は、value
属性を設定し、input
イベントを傍受することによって実現される.役割ドメインスロットのJSX
の書き方は、公式サイトレンダリング関数&JSXのスロット章を参照して理解できます.イベントインターコネクト処理に関するJSX
の書き方は、template
テンプレートに従ってイベントインターコネクト処理、すなわちこのようなフォーマットonClick={that.handleEdit(scope.$index, scope.row)}
を記述すると、最初のレンダリング時にイベントコールバック方法がトリガーされ、click
コールバックイベントに指定されたエラーがないことがわかります.コンソールの出力結果は、イベントコールバックメソッドを簡単に書き換えることで、イベント処理のプロセスを匿名関数に入れて返すことで、イベントインライン処理の効果を実現できます.転載先:https://juejin.im/post/5bf6ea4df265da611c269ee0