66 Vue2高级用法

自定义组件model

    <!-- 自定义 v-model -->
    <CustomVModel v-model="name"/> 
    <!-- CustomVModel -->
    <template>
        <!-- 例如:vue 颜色选择 -->
        <input type="text"
            :value="text"
            @input="$emit('change', $event.target.value)"
        >
        <!--
            1. 上面的 input 使用了 :value 而不是 v-model
            2. 上面的 change 和 model.event 要对应起来
            3. text 属性对应起来
        -->
    </template>
    
    <script>
    export default {
        model: {
            prop: 'text', // 对应 props text
            event: 'change'
        },
        props: {
            text1: String,
            default() {
                return ''
            }
        }
    }
    </script>

vue3自定义组件model

    <!-- index.vue -->
    <CustomVModel v-model="name"/> 
    
    <!-- CustomVModel.vue -->
    <template>
        <input type="text"
            :value="modelValue"
            @input="$emit('update:modelValue', $event.target.value)"
        >
    </template>
    
    <script>
    export default {
        props: {
            modelValue: String,
        }
    }
    </script>

vue2 slot

    <!-- slotDemo.vue 默认插槽 -->
    <template>
        <a :href="url">
            <slot>
                默认内容,即父组件没设置内容时,这里显示
            </slot>
        </a>
    </template>
    
    <script>
    export default {
        props: ['url'],
        data() {
            return {}
        }
    }
    </script>
    
    <!-- 用法 -->
    <SlotDemo :url="website.url">
        {{website.title}}
    </SlotDemo>
    <!-- ScopedSlotDemo.vue 作用域插槽demo -->
    <template>
        <a :href="url">
            <slot :slotData="website">
                {{website.subTitle}} <!-- 默认值显示 subTitle ,即父组件不传内容时 -->
            </slot>
        </a>
    </template>
    
    <script>
    export default {
        props: ['url'],
        data() {
            return {
                website: {
                    url: 'http://test.com/',
                    title: 'test',
                    subTitle: 'subtitle'
                }
            }
        }
    }
    </script>
    
    <!-- 用法 -->
    <ScopedSlotDemo :url="website.url">
        <template v-slot="slotProps">
            {{slotProps.slotData.title}}
        </template>
    </ScopedSlotDemo>
    <!-- 具名插槽 -->
    <div>
        <header>
            <slot name="header" />
        </header>
        <main>
            <slot  />
        </main>
        <footer>
            <slot name="footer" />
        </footer>
    </div>
    
    <!-- 用法 -->
    <template>
        <template #header></template>
        <p>默认显示到main slot中</p>
        <template #footer></template>
    </template>

vue2动态组件

动态组件

  • :is="component-name
  • 需要根据数据,动态渲染的场景。即组件类型不确定
    <component :is="compoentName"/>

vue2异步组件

  • import()函数
  • 按需加载异步大组件
    <!-- 异步组件 -->
    <template>
        <FormDemo v-if="showFormDemo"/>
        <button @click="showFormDemo = true">show form demo</button>
    </template>
    <script>
    export default {
        components: {
            FormDemo: () => import('./FormDemo'), // 异步加载组件,初始化不加载
        },
    }
    </script>
Last Updated:
Contributors: leeguooooo