Har*_*til 13 javascript vue.js vue-component vuejs2
我有一个带插槽的以下组件:
<template>
<div>
<h2>{{ someProp }}</h2>
<slot></slot>
</div>
</template>
Run Code Online (Sandbox Code Playgroud)
出于某些原因,我必须手动实例化此组件.这就是我这样做的方式:
const Constr = Vue.extend(MyComponent);
const instance = new Constr({
propsData: { someProp: 'My Heading' }
}).$mount(body);
Run Code Online (Sandbox Code Playgroud)
问题是:我无法以编程方式创建插槽内容.到目前为止,我可以创建基于字符串的简单插槽:
const Constr = Vue.extend(MyComponent);
const instance = new Constr({
propsData: { someProp: 'My Heading' }
});
// Creating simple slot
instance.$slots.default = ['Hello'];
instance.$mount(body);
Run Code Online (Sandbox Code Playgroud)
问题是 - 如何以$slots编程方式创建并将其传递给我正在创建的实例new?
注意:我没有使用完整版本的Vue.js(仅限运行时).所以我没有可用的Vue.js编译器来动态编译模板.
我查看了TypeScript定义文件,Vue.js并在Vue组件实例上找到了一个未记录的函数:$createElement().我的猜测是,它是传递给render(createElement)组件功能的相同功能.所以,我能够解决它:
const Constr = Vue.extend(MyComponent);
const instance = new Constr({
propsData: { someProp: 'My Heading' }
});
// Creating simple slot
const node = instance.$createElement('div', ['Hello']);
instance.$slots.default = [node];
instance.$mount(body);
Run Code Online (Sandbox Code Playgroud)
但这显然没有记载,因此有问题的方法.如果有更好的方法,我不会给它回答.
我想我终于偶然发现了一种以编程方式创建槽元素的方法。据我所知,该方法似乎不适用于功能组件。我不知道为什么。
如果您正在为组件实现自己的渲染方法,则可以使用 createElement 方法(或在渲染方法中为其指定别名的任何内容)以编程方式创建传递给子元素的槽,并传递包含 { slot 的数据哈希: NAME_OF_YOUR_SLOT } 后跟该槽内的子项数组。
例如:
Vue.config.productionTip = false
Vue.config.devtools = false;
Vue.component('parent', {
render (createElement) {
return createElement('child', [
createElement('h1', { slot: 'parent-slot' }, 'Parent-provided Named Slot'),
createElement('h2', { slot: 'default' }, 'Parent-provided Default Slot')
])
}
})
Vue.component('child', {
template: '<div><slot name="parent-slot" /><slot /></div>'
})
new Vue({
el: '#app',
template: '<parent />'
})Run Code Online (Sandbox Code Playgroud)
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
<div id='app'>
</div>Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2804 次 |
| 最近记录: |