v-model에 소품 바인딩 시도 중
나는 vuetify.js를 사용하고 애플리케이션 전체에서 재사용할 수 있는 구성요소를 만들려고 한다.비록 그것은 완벽하게 잘 작동하지만, 나는 그것이 올바른 방법인지 확신할 수 없다.
항상 메뉴 옵션이 같지만 UI 요소에서 열 수 있는 내비게이션 드로어 구성요소를 만들고 있다.
아래는 암호다.
// 내비게이션 바.부에를 하다
<template>
<v-navigation-drawer
temporary
v-model="drawerFlag"
light
overflow
fixed
>
<v-list>
<v-list-tile>
<v-list-tile-action @click.stop="toggleDrawer()">
<v-btn icon>
<v-icon>close</v-icon>
</v-btn>
</v-list-tile-action>
</v-list-tile>
</v-list>
<v-list class="pt-0">
<template v-for="item in items">
<v-list-tile :key="item.title" :to="item.link">
<v-list-tile-action>
<v-icon>{{ item.icon }}</v-icon>
</v-list-tile-action>
<v-list-tile-content>
<v-list-tile-title>{{ item.title }}</v-list-tile-title>
</v-list-tile-content>
</v-list-tile>
<v-divider></v-divider>
</template>
</v-list>
</v-navigation-drawer>
</template>
<script>
export default {
props: ['drawer'],
data() {
return {
items: [
{ title: 'Home', icon: 'home', link: '/home'},
{ title: 'History', icon: 'history', link: '/history' },
{ title: 'Wallet', icon: 'account_balance_wallet', link: '/wallet' },
{ title: 'My Profile', icon: 'person', link: '/profile' },
{ title: 'Settings', icon: 'settings', link: '/settings' },
{ title: 'About', icon: 'error', link: '/about' },
{ title: 'Logout', icon: 'power_settings_new', link: '/logout' },
]
};
},
computed: {
drawerFlag: {
get: function() {
return this.drawer
},
set: function() {
}
}
},
methods: {
toggleDrawer: function() {
this.$emit('emitToggleDrawer');
}
}
}
</script>
//홈.vue
<template>
<div class="full-screen">
<navigation-bar :drawer="drawer" v-on:emitToggleDrawer="toggleDrawer"></navigation-bar>
<v-btn icon class="mt-3 fixed-position" @click.stop="drawer = !drawer">
<v-icon>menu</v-icon>
</v-btn>
</div>
</template>
<script>
export default {
name: 'home',
data() {
return {
drawer: null
};
},
computed: {
user() {
return this.$store.getters.user;
}
},
methods: {
toggleDrawer: function () {
this.drawer = !this.drawer;
}
}
};
</script>
위의 코드에서..
상위 구성 요소에서는 내비게이션 드로어를 여는 버튼이 있고 내비게이션 드로어의 상태는 "드로어"라는 상위 구성 요소에서 유지된다.그런 다음, "드로어"를 하위 구성요소에 대한 소품으로 전달하고 하위 구성요소에서 "emitToggleDrawer"라는 상위 구성요소로 이벤트를 트리거하는 방법을 전달한다.
하위 구성 요소에서는 v-model="drawerFlag"를 사용하는 vuetify.js 내비게이션 드로어를 사용하고 있으며 여기서 drawerFlag는 계산된 속성이다.v-model="rawer" 즉, 소품 바인딩을 사용하려고 했을 때 오류가 발생하고 있었다.그러면 내비게이션 드로어 내부의 요소를 클릭하여 내비게이션 드로어를 닫을 수 있다.그것을 이루기 위해서, 나는 나중에 부모 구성요소가 듣는 이벤트를 발생시키는 구성요소의 메소드를 호출한다.
이렇게 풀었어.
앱뷰
<my-drawer ref="drawer"></my-drawer>
<my-header @toggle-drawer="$refs.drawer.drawer = !$refs.drawer.drawer"></my-header>
마이 드로어.부에를 하다
<v-navigation-drawer v-model="drawer">
...
data() {
drawer: true
}
마이헤더.부에를 하다
<v-toolbar-side-icon @click.stop="$emit('toggle-drawer')"></v-toolbar-side-icon>
It seems to me that we need
v-model="drawer"
on custom drawer component so it can properly work on all screen sizes.
따라서 부모(또는 형제)의 가치를 어떻게 해서든지 바꿀 필요가 있다. 그래서 나는 서랍 구성 요소에 ref를 사용하고 있다.아마 바꾸는 대신$refs.drawer.drawer
대신 서랍 기능을 호출할 수 있는 데이터.뭐가 더 좋을지 모르겠어.그러나 이것은 모든 화면 크기에 대해 나에게 효과가 있는 유일한 간단한 솔루션이었다.
그래서 내 경우는 머리글에서만 서랍 상태를 바꾸고 있지만, 이걸 쓰고 니 필요에 맞게 맞춰도 될 것 같아.
나는 아래와 같이 비슷한 문제를 풀었다.
- 그냥 사용
drawer
사용하지 않고drawer
그리고drawerFlag
- 하위 구성 요소에 추가 버튼이 없는 경우
- 방출하지 않음
event
자식에서 부모까지 - 사용.
watch
아동 구성 요소로서
홈.뷰
<template>
<div class="full-screen">
<navigation-bar :drawer="drawer"></navigation-bar>
<v-btn icon class="mt-3 fixed-position" @click.stop="drawer = !drawer">
<v-icon>menu</v-icon>
</v-btn>
</div>
</template>
<script>
import NavigationBar from '@/components/NavigationBar';
export default {
name: 'home',
data() {
return {
drawer: true
};
},
components: {
NavigationBar
}
}
</script>
내비게이션 바.부에를 하다
<template>
<v-navigation-drawer
temporary
v-model="drawer"
light
overflow
fixed
>
<v-list class="pt-0">
<template v-for="item in items">
<v-list-tile :key="item.title" :to="item.link">
<v-list-tile-action>
<v-icon>{{ item.icon }}</v-icon>
</v-list-tile-action>
<v-list-tile-content>
<v-list-tile-title>{{ item.title }}</v-list-tile-title>
</v-list-tile-content>
</v-list-tile>
<v-divider></v-divider>
</template>
</v-list>
</v-navigation-drawer>
</template>
<script>
export default {
props: ['drawer'],
data() {
return {
items: [
{ title: 'Home', icon: 'home', link: '/home'},
{ title: 'History', icon: 'history', link: '/history' },
{ title: 'Wallet', icon: 'account_balance_wallet', link: '/wallet' },
{ title: 'My Profile', icon: 'person', link: '/profile' },
{ title: 'Settings', icon: 'settings', link: '/settings' },
{ title: 'About', icon: 'error', link: '/about' },
{ title: 'Logout', icon: 'power_settings_new', link: '/logout' },
]
};
},
watch: {
drawer (value) {
return value;
}
}
}
</script>
참조URL: https://stackoverflow.com/questions/46421080/trying-to-bind-props-to-v-model
'IT이야기' 카테고리의 다른 글
리눅스 커널에 있는 함수의 포인터에서 함수의 이름을 가져오는 방법? (0) | 2022.04.25 |
---|---|
여러 파일을 base64 문자열로 변환하는 방법? (0) | 2022.04.25 |
바인딩 실패:이미 사용 중인 주소 (0) | 2022.04.25 |
동일한 페이지에서 여러 Vue 구성 요소의 성능 향상 (0) | 2022.04.25 |
Vue.js 2 - vue-youtube가 포함된 비디오 종료 상태 탐지 방법? (0) | 2022.04.25 |