我有以下jsfiddle有两个Vuetify标签。文档没有显示使用type Props<T extends React.Component<any, any>> = T extends React.Component<infer P, any> ? P : never;
type State<T extends React.Component<any, any>> = T extends React.Component<any, infer S> ? S : never;
function HocThatMagicallyProvidesProperty<T extends {new(...args:any[]): React.Component<any, any>},
TProps = Props<InstanceType<T>>,
TState=State<InstanceType<T>>,
TNewProps = Pick<TProps, Exclude<keyof TProps, 'world'>>>(constructor: T) :
(p: TNewProps) => React.Component<TNewProps, TState> {
throw "";
}
interface MyProps {
hello: string;
world: number;
}
interface MyState { }
const MyComponent = HocThatMagicallyProvidesProperty(class extends React.Component<MyProps, MyState> {
constructor(props: MyProps, context: any) {
super(props, context);
}
public render() {
return <div></div>;
}
})
function usingThatComponent() {
return (
<MyComponent
hello="test"
/>
);
}
的示例。
我发现Medium.com post关于如何将Vuetify与vue-router
一起使用,其中包含以下代码:
vue-router
但是,代码现已过时,因为Vuetify 1.0.13 Tabs documentation未在其api中指定<div id="app">
<v-tabs grow light>
<v-tabs-bar>
<v-tabs-item href="/" router>
<v-icon>motorcycle</v-icon>
</v-tabs-item>
<v-tabs-item href="/dog" router>
<v-icon>pets</v-icon>
</v-tabs-item>
</v-tabs-bar>
</v-tabs>
<router-view />
</div>
道具,因此帖子中嵌入的示例无效。
我还发现这个StackOverflow answer有以下代码:
router
然而,使用<v-tabs-item :to="{path:'/path/to/somewhere'}">
道具并不起作用,它也没有在Vuetify api中列出。相比之下,to
Vuetify组件会列出v-button
道具并使用to
,因此我希望vue-router
支持的组件支持vue-router
道具。
在旧版old Vuetify 0.17 docs中挖掘,为to
指定to
道具。似乎在1.0.13中可能已经删除了支持。
如何将v-tabs-item
与Vuetify标签一起使用?
答案 0 :(得分:31)
vue-router
道具以及其他to
道具添加到Vuetify tabs docs。说真的,社区很棒。
Vuetify社区Discord的人们能够帮助我。我更新的jsfiddle现在有了工作代码。
基本上,vue-router
是v-tab
的包装器,我假设它使用插槽将道具传递给router-link
,因此将router-link
道具放在to
上工作正常。
以下代码是工作代码的示例:
v-tab
<v-app dark>
<v-tabs fixed-tabs>
<v-tab to="/foo">Foo</v-tab>
<v-tab to="/bar">Bar</v-tab>
</v-tabs>
<router-view></router-view>
</v-app>
答案 1 :(得分:8)
我只是在此处添加一些与动画有关的技巧,并阐明v-tab-items
与v-tab-item
的使用。
如果您已经注意到,请按照以下方式使用工作标记,以防止v-tabs标签切换动画起作用:
<v-tabs v-model="activeTab">
<v-tab key="tab-1" to="/tab-url-1">tab 1</v-tab>
<v-tab key="tab-2" to="/tab-url-2">tab 2</v-tab>
</v-tabs>
<router-view />
如果要保留选项卡切换动画,这是一种方法。
<v-tabs v-model="activeTab">
<v-tab key="tab-1" to="/tab-url-1" ripple>
tab 1
</v-tab>
<v-tab key="tab-2" to="/tab-url-2" ripple>
tab 2
</v-tab>
<v-tab-item id="/tab-url-1">
<router-view v-if="activeTab === '/tab-url-1'" />
</v-tab-item>
<v-tab-item id="/tab-url-2">
<router-view v-if="activeTab === '/tab-url-2'" />
</v-tab-item>
</v-tabs>
请注意,只要您在
v-for
属性中找到v-tab
值,就可以在v-tab-item
和to
标签上使用id
循环您的v-tab-item
个。如果您需要将标签内容放置在与标签按钮不同的位置,这就是
v-tab-items
的目的。您可以将v-tab-item
放在v-tab-items
组件之外的v-tabs
标记中。确保为它提供一个v-model="activeTab"
属性。
答案 2 :(得分:5)
2019年使用vuetify 1.5.6
<div>
<v-tabs v-model="activeTab" grow>
<v-tab v-for="tab of tabs" :key="tab.id" :to="tab.route" exact>
{{ tab.name }}
</v-tab>
<v-tab-item v-for="tab of tabs" :key="tab.id" :value="tab.route">
<router-view></router-view>
</v-tab-item>
</v-tabs>
</div>
还有js部分:
data() {
return {
activeTab: `/user/${this.id}`,
tabs: [
{ id: 1, name: "Task", route: `/user/${this.id}` },
{ id: 2, name: "Project", route: `/user/${this.id}/project` }
]
};
}
路线:
{
path: "/user/:id",
component: User1,
props: true,
children: [
{
path: "", //selected tab by default
component: TaskTab
},
{
path: "project",
component: ProjectTab
}
]
}
答案 3 :(得分:0)
以下代码对我有用
<v-tabs fixed-tabs>
<v-tab>Locations</v-tab>
<v-tab>Employees</v-tab>
<v-tab-item>Tab 1 content
<locations-data/>
</v-tab-item>
<v-tab-item>Tab 2 content
<employees-data/>
</v-tab-item>
</v-tabs>
<script>
import LocationsData from './Settings/Locations';
import EmployeesData from './Settings/Employees';
export default {
components: {
LocationsData,
EmployeesData
},
}
</script>
答案 4 :(得分:0)
//urls in some componet
<v-btn @click="goToUrl({name: 'RouteName1'})">
.....
<v-list-item-title
@click="goToUrl({name: 'RouteName2'})"
>
Some tab link text
</v-list-item-title>
....
//tabs menu and content in other component
<v-tabs>
<v-tab key="key_name1" :to="{ name: 'RouteName1'}">Some link 1</v-tab>
<v-tab key="key_name2" :to="{ name: 'RouteName2'}">Some link 2</v-tab>
<v-tab-item key="key_name1" value="/url/for/route1">
....
<v-tab-item key="key_name2" value="/url/for/route2">
....
答案 5 :(得分:-1)
并保留您现有的查询参数:有用例如如果您的网址中有 :locale:
<v-tabs v-model="activeTab">
<v-tab v-for="tab in tabs" :key="tab.id" :to="tab.to">
{{ tab.name }}
</v-tab>
</v-tabs>
<v-tabs-items v-model="activeTab" @change="updateRouter($event)">
<v-tab-item v-for="tab in tabs" :key="tab.id" :value="tab.to">
<router-view />
</v-tab-item>
</v-tabs-items>
export default {
data: () => ({
activeTab: '',
}),
computed: {
tabs() {
return [
{ id: 1, name: 'Tab one', to: this.getTabPath('routeName1') },
{ id: 2, name: 'Tab two', to: this.getTabPath('routeName2') },
{ id: 3, name: 'Tab three', to: this.getTabPath('routeName3') },
{ id: 4, name: 'Tab four', to: this.getTabPath('routeName4') },
]
},
},
methods: {
getTabPath(name) {
// Get the path without losing params. Usefull e.g. if you have a :locale in your url:
return this.$router.resolve({ name, params: this.$route.params }).href
},
updateRouter(path) {
// Gets called upon swipe.
this.$router.push(path)
},
},
}
使用 $router.resolve
从路由对象获取路径,如 here 所述。