凯发k8天生赢家一触即发

vue 定义组件模板的七种方式(一般用单文件组件更好) -凯发k8天生赢家一触即发

2023-08-17,,

在 vue 中一个模板,至少有不同的方式(或许还有其它我不知道的方式):

字符串
模板字面量
x-template
内联模板
render 函数
jsf
单文件组件

在这篇文章中,我将通过示例介绍每个选项,并探讨利弊。以便你知道在任何特定情况下最适合的是哪一种。

1. 字符串

默认情况下,模板会被定义为一个字符串。我想我们的观点会达成一致:字符串中的模板是非常难以理解的。除了广泛的浏览器支持之外,这种方法没有太多用处。

vue.component('my-checkbox', {
template: `
`,
data() {
return { checked: false, title: 'check me' }
},
methods: {
check() { this.checked = !this.checked; }
}
});

2. 模板字面量

es6 模板字面量允许你使用多行定义模板,这在常规 javascript 字符串中是不被允许的。此方式阅读体验更佳,并在许多现代浏览器中得到支持,不过安全起见你还是需要把代码转换成 es5 。
这种方法并不完美,我发现大多数 ide 仍然会通过语法高亮、tab 格式化、换行符等地方的问题折磨着你。

vue.component('my-checkbox', {
template: `



`,
data() {
return { checked: false, title: 'check me' }
},
methods: {
check() { this.checked = !this.checked; }
}
});

3. x-template

使用此方法,你的模板被定义在例如 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; }
}
});

4. 内联模板

通过在组件中添加 inline-template 属性,你可以向 vue 指示内部内容是其模板,而不是将其视为分布式内容(参考 slot 。
它与 x-templates 具有相同的缺点,不过一个优点是,内容在 html 模板的正确位置,因此可以在页面加载时呈现,而不是等到 javascript 运行。

vue.component('my-checkbox', {
data() {
return { checked: false, title: 'check me' }
},
methods: {
check() { this.checked = !this.checked; }
}
});





5. render 函数

render 函数需要你将模板定义为 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,
checked: this.checked
}
}
),
createelement(
'div',
{
attrs: {
'class': 'title'
}
},
[ this.title ]
)
]
);
}
});

6. jsx

vue 中最有争议的模板选项是 jsx,一些开发者认为它丑陋、不直观,是对 vue 精神的背叛。jsx 需要你先编译,因为它不能被浏览器运行。
不过,如果你需要完整的 javascript 语言功能,又不太适应 render 函数过于抽象的写法,那么 jsx 是一种折衷的方式。

vue.component('my-checkbox', {
data() {
return { checked: false, title: 'check me' }
},
methods: {
check() { this.checked = !this.checked; }
},
render() {
return


{ this.title }


}
});

单文件组件

只要你把构建工具设置的很舒服,单文件组件就是模板选项中的王者。它允许你写 html 标签定义组件,并且将所有组件定义保留在一个文件中。
尽管它也有一些劣势:需要预编译,某些 ide 不支持 .vue 文件的语法高亮,不过其地位依然难以被撼动。


你还可以通过引入 pug 之类的预处理器,来获得模板定义的更多可能性。

vue 定义组件模板的七种方式(一般用单文件组件更好)的相关教程结束。

网站地图