v-component refactor