Vue.js 有没有办法把一个有范围的插槽从模板缩短到一个有道具的组件?
我正在组件中使用命名和作用域插槽 以下各项工作完美无瑕:Vue.js 有没有办法把一个有范围的插槽从模板缩短到一个有道具的组件?,vue.js,Vue.js,我正在组件中使用命名和作用域插槽 以下各项工作完美无瑕: <template #name="s"> <table-cell :value="s.item.name" /> </template> 但我希望类似的事情也能奏效: <table-cell #name="s" :value="s.item.name" /> 它不会给我任何编译错误,但也不会呈现。运行时抛出错误“s”未定义 像这样的事情可能吗?我认为这更像是对v-bind
<template #name="s">
<table-cell :value="s.item.name" />
</template>
但我希望类似的事情也能奏效:
<table-cell #name="s" :value="s.item.name" />
它不会给我任何编译错误,但也不会呈现。运行时抛出错误“s”未定义
像这样的事情可能吗?我认为这更像是对
v-bind
的限制
Vue正在评估:value
绑定属性,该属性不在插槽范围内,而是在父级。这就是为什么会出现“s未定义”错误
要使作用域插槽工作,它们首先需要通过DOM层次结构建立作用域,而您并没有给它这样的机会
简言之,你必须坚持
属性存在于父函数作用域中,但作用域插槽的子级将在新函数作用域中传递参数。我不知道答案,但也很好奇,因此尝试Vue的理解 模板:
{{s.item.name}
编译的渲染函数:
函数匿名(){
(这个){
返回(
“表行”,
[
_c(“表格单元格”{
属性:{value:s.item.name},//属性使用父scoope
scopedSlots:\u([
{
键:“名称”,
fn:函数{//子函数获得新的函数作用域
返回[_v(_s(s.item.name))];
},
},
]),
}),
],
1.
);
}
}
如果使用包装在
中的模板:
{{s.item.name}
编译的渲染函数:
函数匿名(){
(这个){
返回_c(“表行”{
scopedSlots:\u([
{
键:“名称”,
fn:功能{
返回[
//整个表格单元在插槽范围内呈现
_c(“表格单元格,{attrs:{value:s.item.name}}[
_v(_s(s.item.name)),
]),
];
},
},
]),
});
}
}
调查之后,我的新问题是:第一个示例为什么有效?scopedSlots
正在传递给子级,但不知何故最终成为父级的作用域插槽。这是因为Vue中有一些奇特的步法,您可以看到为什么s
在检查编译的渲染函数时属于父范围。我的答案中包含了编译后的函数。是的,谢谢。你真的为此付出了额外的努力。但愿我能投两次票