2017-09-22 9 views
1

vueコンポーネントとインラインテンプレートの間に奇妙な動作が見られます。Vueコンポーネント - 間違った位置でのレンダリング

例#1:インラインテンプレート

これは期待通りに働いています。下の例2のようにvueコンポーネントは変更されていませんが、唯一の違いはテンプレートコンテンツをインラインテンプレートとしてタグにコピーしたことだけです。

参照:https://jsfiddle.net/pobffmnv/

<div class="panel panel-primary"> 
    <div class="panel-heading">Current Clients</div> 
    <table class="table table-hover"> 
     <thead> 
      <tr> 
       <th>Client Name</th> 
       <th style="text-align: center;">No. Projects</th> 
       <th style="text-align: center;">Time (7 days)</th> 
       <th style="text-align: center;">Edit</th> 
      </tr> 
     </thead> 
     <tbody> 
      <clientlistitem inline-template> 
       <tr> 
        <td>Test</td> 
        <td style="text-align: center;">0</td> 
        <td style="text-align: center;">0</td> 
        <td style="text-align: center;"> 
         <div class="btn-group btn-group-xs" role="group"> 
          <button type="button" class="btn small btn-primary">Edit</button> 
         </div> 
        </td> 
       </tr> 
      </clientlistitem> 
     </tbody> 
    </table> 
</div> 

これは正しく、次を示しています Correct

例#2:

次は私のVueのテンプレートでインラインありません。以下は、インラインテンプレートを削除するコードの変更です。

参照:https://jsfiddle.net/Ld47hoy2/

<template> 
    <tr> 
     <td>Test</td> 
     <td style="text-align: center;">0</td> 
     <td style="text-align: center;">0</td> 
     <td style="text-align: center;"> 
      <div class="btn-group btn-group-xs" role="group"> 
       <button type="button" class="btn small btn-primary"> 
        Edit 
       </button> 
      </div> 
     </td> 
    </tr> 
</template> 
<script> 
    export default { 

    } 
</script> 

更新ページコード:

<div class="panel panel-primary"> 
    <div class="panel-heading">Current Clients</div> 
    <table class="table table-hover"> 
     <thead> 
      <tr> 
       <th>Client Name</th> 
       <th style="text-align: center;">No. Projects</th> 
       <th style="text-align: center;">Time (7 days)</th> 
       <th style="text-align: center;">Edit</th> 
      </tr> 
     </thead> 
     <tbody> 
      <clientlistitem></clientlistitem> 
     </tbody> 
    </table> 
</div> 

しかし、上記で、次が表示されます。出力のソースコードを見てみると Incorrect

ページの、それは私のテーブルの前にレンダリングされたコードを入れているようだ...?私は

Strange output

...これは<tbody></tbody>タグの間になるように、その場所に任意の理由はVueのだろう出力コードの代わりに、予想されるものを期待していますか?

答えて

3

ここでの問題点は、in DOM templatesではテンプレートがブラウザで最初にレンダリングされ、HTMLテーブルでは内部で特定の種類の要素しか使用できないという点です。その場合、コンポーネントclientlistitemが最初にレンダリングされますテーブルの外にの場合、Vueはテンプレートをコンパイルして、コンポーネントを間違った場所に配置します。

これを修正するには、is special attributeを使用してください。

<tbody> 
    <tr is="clientlistitem"></tr> 
</tbody> 

ブラウザはこれを受け入れて、正しい場所にtrをレンダリングするが、Vueのは、あなたのコンポーネントとしてそれを解釈するでしょう。

あなたのフィドルはupdatedです。

+0

驚くばかりです。だから、 "is"を使うことは、DOMのどこにも関係なく、常により安全だと言いますか? – Kannaiyan

+0

@Kannaiyanいいえ、 'is'を使うのはテーブルのような非常に特殊なインスタンスでは* only *です。最も安全なのは、文字列テンプレートまたは単一のファイルコンポーネントを使用することです。答えの最初のリンクを見てください。 – Bert

+0

すごい!おかげさまで、これは魅力的でした。 –

関連する問題