1. 程式人生 > >Vue.js 中,7種定義元件模板的方法

Vue.js 中,7種定義元件模板的方法

本文由Mcbai在眾成翻譯平臺上翻譯。

有多種方式可以在vue中定義模板元件。我算了一下,至少有7種不同的方法:

  • 字串(String)

  • 模板字串(Template literal)

  • X-Templates

  • 內聯(Inline)

  • Render函式(Render functions)

  • JSX

  • 單檔案元件(Single page components)

當然,可能還有更多方法!

在這篇文章裡,我們將會展示每一個方法的示例,分析其優缺點,以便你能明白在特定的情形下,哪種方式是合適的。

1. 字串

預設情況下,在JS檔案裡模板會被定義為一個字串。但是我覺得大家都會同意這種寫法很難看懂,它除了有廣泛的瀏覽器支援之外,並沒有什麼優勢。

Vue.component('my-checkbox', {

  template: '<div class="checkbox-wrapper" @click="check"><div :class="{ checkbox: true, checked: checked }"></div><div class="title">{{ title }}</div></div>',

  data() {

    return { checked: false, title: 'Check me' }

  },

  methods: {

    check

() { this.checked = !this.checked; }

  }

});

2. 模板字串(Template literals)

通過ES6的模板字串(反引號)語法,你在定義模板時可以直接換行,這是通過常規的JavaScript字串沒法做到的。這種寫法更容易閱讀,並且這種模板字串語法得到了許多新版本瀏覽器的支援。當然,為了安全起見,你仍然應該把它轉譯為ES5的語法形式。

然而,這種方式並不完美,我發現大多數的IDE在語法高亮上做的差強人意,並且在縮排和換行等的格式方面,仍然很痛苦。

Vue.component('my-checkbox', {

  template: `<div class="checkbox-wrapper"

 @click="check">

              <div :class="{ checkbox: true, checked: checked }"></div>

              <div class="title">{{ title }}</div>

            </div>`,

  data() {

    return { checked: false, title: 'Check me' }

  },

  methods: {

    check() { this.checked = !this.checked; }

  }

});

3. X-Templates

使用這種方法,你需要在index.html檔案裡的script標籤中定義你的模板。script標籤需要新增text/x-template型別作為標記,並且在定義元件時,通過id來引用。

我喜歡這種方式,它允許你使用真正的HTML標記來書寫你的HTML檔案,但是不足之處在於,這種方式會把模板和元件其它部分的定義分開。

Vue.component('my-checkbox', {

  template: '#checkbox-template',

  data() {

    return { checked: false, title: 'Check me' }

  },

  methods: {

    check() { this.checked = !this.checked; }

  }

});

<script type="text/x-template" id="checkbox-template">

<div class="checkbox-wrapper" @click="check">

<div :class="{ checkbox: truechecked: checked }"></div>

<div class="title">{{ title }}</div>

</div>

</script>

4. 內聯模板(Inline Templates)

通過給元件新增inline-template屬性來告訴Vue,裡面的內容就是模板,而不是把它當作是分發內容(見 slots)。

它的缺點和x-templates一樣,但是有一個優點就是,它的內容就在HTML模板對應的位置,所以頁面一載入就會渲染,而不用等到JavaScript執行。

Vue.component('my-checkbox', {

  data() {

    return { checked: false, title: 'Check me' }

  },

  methods: {

    check() { this.checked = !this.checked; }

  }

});

<my-checkbox inline-template>

  <div class="checkbox-wrapper" @click="check">

    <div :class="{ checkbox: truechecked: checked }"></div>

    <div class="title">{{ title }}</div>

  </div>

</my-checkbox>

5. Render functions(渲染函式)

渲染函式需要你把模板當作一個JavaScript物件來進行定義,它們是一些複雜並且抽象的模板選項。

然而,它的優點是你定義的模板更接近編譯器,你可以使用所有JavaScript方法,而不僅是指令提供的那些功能。

Vue.component('my-checkbox', {

  data() {

    return { checked: false, title: 'Check me' }

  },

  methods: {

    check() { this.checked = !this.checked; }

  },

  render(createElement) {

    return createElement(

      'div',

        {

          attrs: {

            'class': 'checkbox-wrapper'

          },

          on: {

            click: this.check

          }

        },

        [

          createElement(

            'div',

            {

              'class': {

                checkbox: true,

<p class="" info"="" style="box-sizing: border-box; outline: 0px; margin-top: 3px; margin-bottom: 3px; padding-top: 0px; padding-bottom: 0px; max-width: 100%;">