英文原版:learn-vuejs
中文翻譯: yoyoys此頁面集結了許多有用的 Vue 實作模式、技術、技巧、以及有幫助的參考連結。
v-if
/ v-else
/ v-else-if
/ v-show
)errorCaptured
事件
Vue.component('my-btn', {
template: `
`,
data() {
return {
text: 'Click me',
};
},
methods: {
handleClick() {
console.log('clicked');
},
},
});
Vue.component('my-btn', {
data() {
return {
text: 'Click me',
};
},
methods: {
handleClick() {
console.log('clicked');
},
},
render(h) {
return h('button', {
attrs: {
class: 'btn-primary'
},
on: {
click: this.handleClick,
},
});
},
});
Vue.component('my-btn', {
data() {
return {
text: 'Click me',
};
},
methods: {
handleClick() {
console.log('clicked');
},
},
render() {
return (
);
},
});
v-if
/ v-else
/ v-else-if
/ v-show
)v-if
只在 v-if 值為 true 時渲染
v-if 與 v-else
只在 v-if 值為 true 時渲染
只在 v-if 值為 false 時渲染
v-else-if
只在 `type` 等於 `A` 時渲染
只在 `type` 等於 `B` 時渲染
只在 `type` 等於 `C` 時渲染
只在 `type` 不等於>fmf `A` 或 `B` 或 `C` 時渲染
v-show
永遠都會渲染,但是只在 `v-show` 值為 true 時顯示
如果你需要同時在多個元素上面做條件式渲染,你可以在 元素上使用這些指令 (v-if / v-else / v-else-if /v-show)。 注意: 元素不會實際渲染一個 DOM。
所有元素
都會被渲染成為 DOM
除了 `template` 元素
如果你在你的 Vue 應用程式中使用 JSX,你可以使用所有 javascript 語句,例如 if else
、 switch case
、三元運算 (ternary
) 與 邏輯運算式 (logical operator)
if else
語句
export default {
data() {
return {
isTruthy: true,
};
},
render(h) {
if (this.isTruthy) {
return 值為真時渲染
;
} else {
return 值為假時渲染
;
}
},
};
switch case
語句
import Info from './Info';
import Warning from './Warning';
import Error from './Error';
import Success from './Success';
export default {
data() {
return {
type: 'error',
};
},
render(h) {
switch (this.type) {
case 'info':
return ;
case 'warning':
return ;
case 'error':
return ;
default:
return ;
},
}
};
switch case
import Info from './Info';
import Warning from './Warning';
import Error from './Error';
import Success from './Success';
const COMPONENT_MAP = {
info: Info,
warning: Warning,
error: Error,
success: Success,
};
export default {
data() {
return {
type: 'error',
};
},
render(h) {
const Comp = COMPONENT_MAP[this.type || 'success'];
return ;
},
};
三元運算子 (ternary operator)
export default {
data() {
return {
isTruthy: true,
};
},
render(h) {
return (
{this.isTruthy ? (
值為真時渲染
) : (
值為假時渲染
)}
);
},
};
邏輯運算子 (logical operator)
export default {
data() {
return {
isLoading: true,
};
},
render(h) {
return {this.isLoading && Loading ...
};
},
};
Difference Between v-if and v-show [With Video at End]
動態元件
使用 is
屬性在
元素上
範例 1 範例 2 範例 3
上面的範例,原有
中的元件,在切換元件的同時將會被消滅。 如果你需要切換後仍保留
中元件的實體,而不被消滅的話,可以包裹一個
標籤,如下:
元件組合
基本組合 (Basic Composition)
繼承 (Extends)
當你需要繼承一個單文件組件 (SFC) 時可以使用。
參考連結
Extending VueJS Components
混入 (Mixins)
// closableMixin.js
export default {
props: {
isOpen: {
default: true
}
},
data: function() {
return {
shown: this.isOpen
}
},
methods: {
hide: function() {
this.shown = false;
},
show: function() {
this.shown = true;
},
toggle: function() {
this.shown = !this.shown;
}
}
}
{{text}}
參考連結
Practical use of Components and Mixins in Vue JS
預設插槽 (Slots (Default))
Login
參考連結
Understanding Component Slots with Vue.js Composing Custom Elements With Slots And Named Slots
具名插槽(Named Slots)
BaseLayout.vue
App.vue
這裡是頁面標題
一段文件主體內的文字
另外一段文字
一些聯絡資訊
作用域插槽 (Scoped Slots)
-
{{ todo.text }}
{{ todo.text }}
參考資料
Getting Your Head Around Vue.js Scoped Slots Understanding scoped slots in Vue.js Scoped Component Slots in Vue.js The Trick to Understanding Scoped Slots in Vue.js The Power of Scoped Slots in Vue
渲染屬性 (Render Props)
大多數狀況下,你可以優先使用作用域插槽 (Scoped Slots) 之於渲染屬性 (Render Props),但是,在某些狀況下渲染屬性還是很有用的。
於單文件組件:
JSX
const Mouse = {
name: "Mouse",
props: {
render: {
type: Function,
required: true
}
},
data() {
return {
x: 0,
y: 0
};
},
methods: {
handleMouseMove(event) {
this.x = event.clientX;
this.y = event.clientY;
}
},
render(h) {
return (
{this.$props.render(this)}
);
}
};
export default Mouse;
有時候你想要傳遞所有參數 (props) 與事件 (listeners) 到子元件,但又不想要宣告所有子元件的參數。 你可以直接將 $attrs
與 $listeners
綁定在子元件上。
{{title}}
Vue 支援 提供 與 注入 (Provide / inject) 機制來傳遞一個物件到所有子代元件中,不管結構有多深,只要都基於同一個父代即可。 注意: provide
和 inject
並沒有響應能力 (reactive) ,除非你傳遞的物件本身就帶有響應能力。
// 父元件
// 子元件
// 孫元件
上述的元件結構,若要從 父元件
取得資料,你必須要透過 參數(props
) 傳遞資料到 子元件
與 孫元件
之中。 但如果 父元件
提供 (provide
) 資料(或物件), 孫元件
可以透過宣告直接 注入(inject
) 父元件
中所定義的資料(或物件)。
// ParentComponent.vue
export default {
provide: {
theme: {
primaryColor: 'blue',
},
},
};
// GrandChildComponent.vue
// ParentComponent.vue
import { Component, Vue, Provide } from 'vue-property-decorator';
@Component
export class ParentComponent extends Vue {
@Provide
theme = {
primaryColor: 'blue',
};
}
// GrandChildComponent.vue
errorCaptured
事件export default {
name: 'ErrorBoundary',
data() {
return {
error: false,
errorMessage: '',
};
},
errorCaptured (err, vm, info) {
this.error = true;
this.errorMessage = `${err.stack}\n\nfound in ${info} of component`;
return false;
},
render (h) {
if (this.error) {
return h('pre', { style: { color: 'red' }}, this.errorMessage);
}
return this.$slots.default[0]
}
};
讓監聽器在 created 事件時就有效
// 不要這樣做
created() {
this.fetchUserList();
},
watch: {
searchText: 'fetchUserList',
}
// 這樣做
watch: {
searchText: {
handler: 'fetchUserList',
immediate: true,
}
}