vue.js - vue-router中基于路由参数的动态组件
问题描述
Vue 中是否可以根据路由参数的值动态使用组件?
这是我正在尝试做的一个例子:
path: '/model/:modelName',
components: {
default: ModelDefinition.models.find((model) => model.key === $route.params.modelName),
},
问题是:$route
这里不可用。也不是modelName
。
如果default
也可以是一个函数(类似于props
),那可能会更好:
path: '/model/:modelName',
components: {
default: (modelName) => (ModelDefinition.models.find((model) => model.key === $route.params.modelName)),
},
这个函数实际上被我惊讶地调用了,但参数似乎是某种函数,当然不是我希望的模型名称。
我需要这个的原因是:这条路线实际上有更多的配置,为各种事情指定了很多组件和值。如果我必须为每个模型指定它,那将是冗长且重复的,并且必须为我们添加到系统中的每个模型进行扩展。
解决方案
我不确定你必须用vue-router “做魔术” - 你为什么不只处理组件内部的参数(或创建一个容器组件,并在那里处理参数)?
下面的代码片段显示您可以使用外部数据来控制应显示的组件。如果您向下传递模型参数,则可以显示任何现有的(和注册的)组件名称。
const CompA = {
template: `<div class="border-blue">COMP-A</div>`
}
const CompB = {
template: `<div class="border-red">COMP-B</div>`
}
new Vue({
el: "#app",
components: {
CompA,
CompB
},
data: {
selected: ''
}
})
[class^="border-"] {
padding: 10px;
}
.border-blue {
border: 1px solid blue;
}
.border-red {
border: 1px solid red;
}
<script src="https://cdn.jsdelivr.net/npm/vue@2.x/dist/vue.js"></script>
<div id="app">
<select v-model="selected">
<option disabled value="">Please select one</option>
<option>CompA</option>
<option>CompB</option>
</select>
<br />
<span>Selected: {{ selected }}</span>
<br />
<br /> Here's a variable component - based on external data:
<component :is="selected"></component>
</div>
推荐阅读
- pytorch - Pytorch 张量相等没有意义
- python-3.x - 有没有办法使用 python imaplib 访问共享邮箱
- javascript - 来自枚举的条件 Typescript 函数类型
- javascript - Branch.io 深层链接在我的浏览器中不起作用
- npm - npm install etherlime 失败
- javascript - 表单提交并返回页面后的操作
- rest - Powershell 脚本不等待来自 Invoke-RestMethod cmdlet 的响应
- c# - 有没有办法按顺序对 sqlite PRAGMA foreign_key_list() 查询的结果进行排序,出现查询的表中的列?
- c# - 在 UITextInput 更改时更新 UILabel (Xamarin)
- testing - 关于编写场景(功能测试)的主要思想?