この記事では主に Vue の render 関数の使い方を紹介しますので、参考にしてください。
レンダリング関数
vueはテンプレートを使用してHTMLを作成します。ただし、特殊な場合には、このハードコーディングされたモデルではニーズを満たすことができず、JS プログラミング機能が必要になります。この時点で、レンダリングを使用して HTML を作成する必要があります。
どのような場合にレンダリング関数を使用するのが適切ですか?
共通のボタンコンポーネントのセットを一度にカプセル化するプロセスでは、ボタンには 4 つのスタイルがあります (デフォルトの成功エラー)。まず、次のような実装が考えられます
<p v-if="type === 'success'">success</p> <p v-else-if="type === 'error'">error</p> <p v-else-if="type === 'warm'">warm</p> <p v-else>default</p>
ボタン スタイルが少ない場合は問題ありませんが、必要なボタン スタイルが 10 個を超える場合、ボタン内のテキストはそれに応じて決定されます。実際の状況 (成功ボタンなど。テキストは OK、GOOD など)。そうなると、ハードコーディングされたテンプレート手法は非常に弱いように見えます。このような状況では、render 関数を使用するのが最良の選択であると言えます。
実際の状況に合わせてボタンコンポーネントを書き換えます
まず、render関数で生成される内容はテンプレートの内容と同等です。そのため、render関数を使用する場合はtemplateタグを削除する必要があります。最初に .vue ファイル内にあります。論理層だけが残ります。
export default { render(h) { return h('p',{ 'class': { btn: true, success: this.type === 'success', error: this.type === 'error', warm: this.type === 'warm', default: this.type === 'default' }, domProps: { innerHTML: this.$slots.default[0].text }, on: { click: this.clickHandle } }) }, methods: { clickHandle() { // dosomething } }, props: { type: { type: String, default: 'default' }, text: { type: String, default: 'default' } } };
コンポーネントベースの考え方によれば、抽象化できるものはすべて、ロジックでハードコーディングしてはなりません。ここの clickHandle 関数はボタンの種類に応じて異なるロジックをトリガーできるため、詳細は説明しません。
その後、jsxを使って親コンポーネントで
<btn v-for="(btn, index) in testData" :type="btn.type" :text="btn.text" :key="index">{{btn.text}} </btn>
を呼び出します
はい、各パラメータの型と使い方を覚えて順番にパラメータを渡すのは本当に面倒です。次に、実際に jsx を使用して、この退屈なプロセスを最適化できます。
return ( <p class={{ btn: true, success: this.type === 'success', error: this.type === 'error', warm: this.type === 'warm', default: this.type === 'default' }} onClick={this.clickHandle}> {this.$slots.default[0].text} </p> )
例 2:
同様のコンポーネントを作成する場合、単純さの観点から (怠惰が人々を進歩させる)、より適切な実装方法を見つける必要があります。 。
<body> <p id="app"> <mycomment :level="2"> 这是h2元素 </mycomment> </p> </body> <script type="text/x-template" id="is"> <p> <h1 v-if="level === 1"> <slot></slot> </h1> <h2 v-if="level === 2"> <slot></slot> </h2> <h3 v-if="level === 3"> <slot></slot> </h3> <h4 v-if="level === 4"> <slot></slot> </h4> <h5 v-if="level === 5"> <slot></slot> </h5> <h6 v-if="level === 6"> <slot></slot> </h6> </p> </script> <script> Vue.component('mycomment',{ template:'#is', props:{ level:{ type:Number, required:true, } } }) var app =new Vue({ el:'#app', }) </script>
現時点では、Render 関数はこの問題を非常にうまく解決します。基本的なスケルトンと見なすことができる簡単な例から始めましょう。次に、必要なスタイルのイベントをコンポーネントに追加します。
<body> <p id="app"> <render-teample :level="4"> render function </render-teample> </p> </body> <script> Vue.component('render-teample',{ render:function(createElement){ return createElement( 'h'+this.level, this.$slots.default ) }, props: { level: { type: Number, required: true } } var app=new Vue({ el:"#app", }); </script>
注: VNode は制約コンポーネント内で一意である必要があります。
1 つの createElement() の下にすべての要素を直接記述するのは非常に面倒であり、メンテナンスにも役立ちません。
通常は
<body> <p id="app"> <render-teample :level="4" > <p class="jah" slot="myslot">render function</p> </render-teample> </p> </body> <script> Vue.component('render-teample',{ render:function(createElement){ return createElement( 'h'+this.level, { 'class':{ show:true, hide:false, }, style:{ width:'200px', height:'400px', background:'red', }, attrs:{ name:'h-ex', id:'h-id' }, props:{ myprops:true, }, on: { click: function(event){ alert(this.num) } }, nativeOn:{ click:function(event) { alert(1111) } } }, [ this.$slots.myslot, createElement('p',{ domProps:{ innerHTML:'holle render' } }) ] ) }, props: { level: { type: Number, required: true } } }); var app=new Vue({ el:"#app", data:{ num:110 } }); </script>
return createElement('p',[com1,com2])を使用できます
この状況は禁止されていますreturn createElement('p',[com1,com1])
上記は私がコンパイルしたものです皆様にとって、今後もお役に立てば幸いです。
関連記事:
Node.jsでmysqlトランザクションの自動リサイクル接続を実装する方法JS配列の要素を削除する方法jsのPromiseに関する知識ポイントを詳しく紹介以上がVue のレンダリング関数の基本的な使用法 (詳細なチュートリアル)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。