当前位置: 首页 > article >正文

Vue学习笔记之组件基础

1、组件的定义

一般将 Vue 组件定义在一个单独的 .vue 文件中,称做单文件组件;当然也可以将组件直接定义在js文件中,如下js代码,定义一个组件BlogPost,通过props定义对外暴露属性title,父组件传递title,子组件根据title渲染html内容。

export default {
    props: ['title'],
    template: `
     <div class="blog-post">
         <h4>{{ title }}</h4>
     </div>`
}

2、组件的使用

首先需要引用组件,语法格式import BlogPost from './BlogPost.js',然后在vue应用对象中注册组件,在components区域注册即可,最后在DOM元素内部使用标签格式,如代码<blog-post title="My jouney with Vue"></blog-post>应用子组件,并传递title属性给子组件渲染。

<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
<div id="app">
   <blog-post title="My jouney with Vue"></blog-post>
</div>
<script type="module">
    import BlogPost from './BlogPost.js'
    const { createApp } = Vue;
    createApp({
        components: {
            BlogPost
        },
    }).mount('#app');
</script>

3、组件的重复应用

可以使用v-for语法循环创建子组件,如代码所示:

<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
<div id="app">
    <blog-post v-for="post in posts" :key="post.id" :title="post.title"></blog-post>
</div>
<script type="module">
    import BlogPost from './BlogPost.js'
    const { createApp } = Vue;
    createApp({
        data() {
            return {
                posts: [
                    { id: 1, title: 'My jounery with Vue' },
                    { id: 2, title: 'Blogging with Vue' },
                    { id: 3, title: 'Why Vue is so fun' }
                ]
            }
        },
        components: {
            BlogPost
        }
    }).mount('#app');
</script>

4、给组件传递事件

组件中模板声明一个按钮,并使用@click绑定点击事件,使用$emit抛出一个事件名为enlarge-text,并通过emits定义对外抛出的事件名称enlarge-text,定义如下代码所示:

export default {
    props: ['title'],
    emits: ['enlarge-text'],
    template: `
     <div class="blog-post">
         <h4>{{ title }}</h4>
         <button @click="$emit('enlarge-text')">Enlarge text</button>
     </div>`
}

应用组件,应用中定义字体大小属性postFontSize,在组件blog-post应用的代码处定义事件@enlarge-text="postFontSize+=0.1",点击后触发字体+0.1:

<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
<div id="app">
    <div :style="{ fontSize: postFontSize + 'em' }">
        <blog-post v-for="post in posts" :key="post.id" :title="post.title" @enlarge-text="postFontSize+=0.1"></blog-post>
    </div>
</div>
<script type="module">
    import BlogPost from './BlogPost.js'
    const { createApp } = Vue;
    createApp({
        data() {
            return {
                posts: [
                    { id: 1, title: 'My jounery with Vue' },
                    { id: 2, title: 'Blogging with Vue' },
                    { id: 3, title: 'Why Vue is so fun' }
                ],
                postFontSize:1
            }
        },
        components: {
            BlogPost
        },
        mounted() {
            
        }
    }).mount('#app');
</script>

5、插槽的应用

在组件中定义一个插槽,模板中语法<slot/>,

export default {
    template: `
     <div class="alert-box">
         <strong>This is an Error for Demo Purpose</strong>
         <slot/>
     </div>`
}

在vue应用中给插槽传递html内容,alert-box元素中的内容“Something bad happened.”将传递给组件的插槽:

<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
<div id="app">
    <alert-box>
        Something bad happened.
    </alert-box>
    <table>
        <tr>
            <td>123</td>
            <td>456</td>
        </tr>
        <tr is="vue:alert-box"></tr>
    </table>
</div>
<script type="module">
    import AlertBox from './AlertBox.js'
    const { createApp } = Vue;
    createApp({
        data() {
            return {
            }
        },
        components: {
            AlertBox
        }
    }).mount('#app');
</script>

 


http://www.kler.cn/a/228717.html

相关文章:

  • Vue进阶之旅:核心技术与页面应用实战(路由进阶)
  • IJCAI-2024 | 具身导航的花样Prompts!VLN-MP:利用多模态Prompts增强视觉语言导航能力
  • html全局遮罩,通过websocket来实现实时发布公告
  • javaEE初阶————多线程初阶(2)
  • 【21】Word:德国旅游业务❗
  • 【Java】LinkedHashMap (LRU)淘汰缓存的使用
  • 01-Datahub是什么?
  • SpringBoot中数据库的连接及Mybatis的配置和使用
  • leetcode(滑动窗口)3.无重复字符的最长字串(C++详细题解)DAY2
  • aspose-words基础功能演示
  • Qt PCL学习(一):环境搭建
  • flink写入es的参数解析
  • PyTorch识别验证码
  • 【云原生kubernetes系列】---亲和与反亲和
  • docker更换镜像源
  • Vue 实现动态路由
  • 恒创科技:服务器内存不足影响大吗?
  • MySQL存储引擎、事务、锁、日志
  • 异地办公必不可缺的远程控制软件,原理到底是什么?
  • docker 的常用命令
  • C#入门及进阶教程|C#基本语法(五):控制台应用程序与格式化输出
  • 乐意购项目前端开发 #6
  • WordPress主题YIA如何将首页的置顶小工具改为站长推荐小工具?
  • 【Linux】解决:为什么重复创建同一个【进程pid会变化,而ppid父进程id不变?】
  • CTFHUB SSRF POST小记
  • 2024最新版Sublime Text 4安装使用指南