mirror of
https://gitee.com/vant-contrib/vant.git
synced 2025-04-06 03:57:59 +08:00
feat: add useRoute
This commit is contained in:
parent
9f372af1ec
commit
762aed3e5d
@ -1,6 +1,6 @@
|
||||
import { computed } from 'vue';
|
||||
import { createNamespace } from '../utils';
|
||||
import { route, routeProps } from '../utils/router';
|
||||
import { useRoute, routeProps } from '../utils/router';
|
||||
import { useParent } from '../api/use-relation';
|
||||
import { ACTION_BAR_KEY } from '../action-bar';
|
||||
import Button from '../button';
|
||||
@ -19,6 +19,7 @@ export default createComponent({
|
||||
},
|
||||
|
||||
setup(props, { slots }) {
|
||||
const route = useRoute();
|
||||
const { parent, index } = useParent(ACTION_BAR_KEY, { isButton: true });
|
||||
|
||||
const isFirst = computed(() => {
|
||||
@ -37,13 +38,9 @@ export default createComponent({
|
||||
}
|
||||
});
|
||||
|
||||
return (vm) => {
|
||||
return () => {
|
||||
const { type, icon, text, color, loading, disabled } = props;
|
||||
|
||||
const onClick = () => {
|
||||
route(vm.$router, vm);
|
||||
};
|
||||
|
||||
return (
|
||||
<Button
|
||||
class={bem([
|
||||
@ -59,7 +56,7 @@ export default createComponent({
|
||||
color={color}
|
||||
loading={loading}
|
||||
disabled={disabled}
|
||||
onClick={onClick}
|
||||
onClick={route}
|
||||
>
|
||||
{slots.default ? slots.default() : text}
|
||||
</Button>
|
||||
|
@ -1,5 +1,5 @@
|
||||
import { createNamespace } from '../utils';
|
||||
import { route, routeProps } from '../utils/router';
|
||||
import { useRoute, routeProps } from '../utils/router';
|
||||
import { useParent } from '../api/use-relation';
|
||||
import { ACTION_BAR_KEY } from '../action-bar';
|
||||
import Icon from '../icon';
|
||||
@ -19,6 +19,7 @@ export default createComponent({
|
||||
},
|
||||
|
||||
setup(props, { slots }) {
|
||||
const route = useRoute();
|
||||
useParent(ACTION_BAR_KEY);
|
||||
|
||||
const renderIcon = () => {
|
||||
@ -45,15 +46,8 @@ export default createComponent({
|
||||
);
|
||||
};
|
||||
|
||||
return (vm) => (
|
||||
<div
|
||||
role="button"
|
||||
class={bem()}
|
||||
tabindex="0"
|
||||
onClick={() => {
|
||||
route(vm.$router, vm);
|
||||
}}
|
||||
>
|
||||
return () => (
|
||||
<div role="button" class={bem()} tabindex="0" onClick={route}>
|
||||
{renderIcon()}
|
||||
{slots.default ? slots.default() : props.text}
|
||||
</div>
|
||||
|
@ -1,7 +1,7 @@
|
||||
// Utils
|
||||
import { createNamespace } from '../utils';
|
||||
import { BORDER_SURROUND, WHITE } from '../utils/constant';
|
||||
import { routeProps, route } from '../utils/router';
|
||||
import { useRoute, routeProps } from '../utils/router';
|
||||
|
||||
// Components
|
||||
import Icon from '../icon';
|
||||
@ -47,6 +47,8 @@ export default createComponent({
|
||||
emits: ['click'],
|
||||
|
||||
setup(props, { emit, slots }) {
|
||||
const route = useRoute();
|
||||
|
||||
const renderLoadingIcon = () => {
|
||||
if (slots.loading) {
|
||||
return slots.loading();
|
||||
@ -114,7 +116,7 @@ export default createComponent({
|
||||
}
|
||||
};
|
||||
|
||||
return (vm) => {
|
||||
return () => {
|
||||
const {
|
||||
tag,
|
||||
type,
|
||||
@ -132,7 +134,7 @@ export default createComponent({
|
||||
const onClick = () => {
|
||||
if (!loading && !disabled) {
|
||||
emit('click', event);
|
||||
route(vm.$router, vm);
|
||||
route();
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
// Utils
|
||||
import { createNamespace, isDef } from '../utils';
|
||||
import { route, routeProps } from '../utils/router';
|
||||
import { useRoute, routeProps } from '../utils/router';
|
||||
import { cellProps } from './shared';
|
||||
|
||||
// Components
|
||||
@ -15,6 +15,8 @@ export default createComponent({
|
||||
},
|
||||
|
||||
setup(props, { slots }) {
|
||||
const route = useRoute();
|
||||
|
||||
const renderLabel = () => {
|
||||
const showLabel = slots.label || isDef(props.label);
|
||||
|
||||
@ -83,7 +85,7 @@ export default createComponent({
|
||||
}
|
||||
};
|
||||
|
||||
return (vm) => {
|
||||
return () => {
|
||||
const { size, center, border, isLink, required } = props;
|
||||
const clickable = isLink || props.clickable;
|
||||
|
||||
@ -97,16 +99,12 @@ export default createComponent({
|
||||
classes[size] = size;
|
||||
}
|
||||
|
||||
const onClick = () => {
|
||||
route(vm.$router, vm);
|
||||
};
|
||||
|
||||
return (
|
||||
<div
|
||||
class={bem(classes)}
|
||||
role={clickable ? 'button' : null}
|
||||
tabindex={clickable ? 0 : null}
|
||||
onClick={onClick}
|
||||
onClick={route}
|
||||
>
|
||||
{renderLeftIcon()}
|
||||
{renderTitle()}
|
||||
|
@ -1,5 +1,5 @@
|
||||
import { createNamespace } from '../utils';
|
||||
import { route, routeProps } from '../utils/router';
|
||||
import { useRoute, routeProps } from '../utils/router';
|
||||
import { useParent } from '../api/use-relation';
|
||||
import { SIDEBAR_KEY } from '../sidebar';
|
||||
import Badge from '../badge';
|
||||
@ -18,9 +18,10 @@ export default createComponent({
|
||||
emits: ['click'],
|
||||
|
||||
setup(props, { emit }) {
|
||||
const route = useRoute();
|
||||
const { parent, index } = useParent(SIDEBAR_KEY);
|
||||
|
||||
return (vm) => {
|
||||
return () => {
|
||||
const { dot, badge, title, disabled } = props;
|
||||
const selected = index.value === parent.active();
|
||||
|
||||
@ -32,7 +33,7 @@ export default createComponent({
|
||||
emit('click', index.value);
|
||||
parent.emit('update:modelValue', index.value);
|
||||
parent.setActive(index.value);
|
||||
route(vm.$router, vm);
|
||||
route();
|
||||
};
|
||||
|
||||
return (
|
||||
|
@ -1,7 +1,7 @@
|
||||
/**
|
||||
* Vue Router support
|
||||
*/
|
||||
|
||||
import { getCurrentInstance } from 'vue';
|
||||
import type { Router, RouteLocation } from 'vue-router';
|
||||
|
||||
export type RouteConfig = {
|
||||
@ -18,8 +18,8 @@ function isRedundantNavigation(err: Error) {
|
||||
);
|
||||
}
|
||||
|
||||
export function route(router: Router, config: RouteConfig) {
|
||||
const { to, url, replace } = config;
|
||||
export function route(router: Router, props: RouteProps) {
|
||||
const { to, url, replace } = props;
|
||||
if (to && router) {
|
||||
const promise = router[replace ? 'replace' : 'push'](to);
|
||||
|
||||
@ -36,6 +36,13 @@ export function route(router: Router, config: RouteConfig) {
|
||||
}
|
||||
}
|
||||
|
||||
export function useRoute() {
|
||||
const vm = getCurrentInstance()!.proxy!;
|
||||
return () => {
|
||||
route(vm.$router, vm as RouteProps);
|
||||
};
|
||||
}
|
||||
|
||||
export type RouteProps = {
|
||||
url?: string;
|
||||
replace?: boolean;
|
||||
|
Loading…
x
Reference in New Issue
Block a user