VUE学习:vue基础12————组件:自定义组件的属性

本文深入探讨了Vue框架中的组件使用,特别是如何通过props自定义组件属性。示例展示了如何在组件模板中使用这些自定义属性,如`mytitle`和`myTest`,并传递数据到子组件的差值表达式中。文章通过实例代码解释了如何在模板中设置原生属性并由Vue管理。

提示:
本文为VUE栏目:VUE学习:vue基础12————组件:自定义组件的属性

VUE学习:VUE学习:vue基础10————组件:组件的使用


前言

本文vue框架中组件相关。


提示:以下是本篇文章正文内容,下面案例可供参考

组件

自定义组件的属性

利用props自定义属性,自定义的属性名可以直接在差值表达式中使用

<body>
<div id="app">
    <test mytitle="hello world"></test>
    <test mytitle="你好世界" my-test="geigei"></test>
</div>
<template id="t1">
<!--    给模板中的p标签设置一个原生的title属性,交给vue管理-->
    <p :title="myTest">{{mytitle}}</p>
</template>

</body>
<script>
    Vue.component('test',{
        template:"#t1",
        // 自定义属性,自定义的属性名可以直接在差值表达式中使用
        props:['mytitle','myTest'],

    })
    let vm = new Vue({
        el: "#app",
        data: {},
        methods: {},
    });
</script>

在这里插入图片描述

<think> 我们参考了上述引用中的方法,特别是引用[3]中纯CSS实现中间文字两边有横线的方法。在Vue 3中,我们可以使用单文件组件(SFC)来封装这个样式,使其可复用。 实现思路: 1. 使用一个容器(div)包裹标题(span),并设置容器为文本居中(text-align: center)。 2. 在标题的span元素上使用伪元素::before和::after来创建左右两侧的横线。 3. 通过绝对定位将伪元素定位到标题的两侧,并调整横线的长度和位置。 注意:由于标题文字长度可能变化,所以需要动态调整横线的位置。我们可以通过设置伪元素的left和right属性,并利用负值偏移来实现。 在Vue 3中,我们可以这样写: 组件:TitleWithLines.vue 我们可以设计一个组件,接受标题文字作为prop,也可以直接使用插槽(slot)来放置标题内容。 这里我们使用插槽的方式,以便更灵活地放入内容(比如不仅仅是文字,还可以是图标等)。 实现步骤: 1. 创建容器(div),设置其样式为相对定位(position: relative),文本居中,并设置行高和边距等。 2. 在容器内放置一个span(或其他行内元素),用于包裹插槽内容。设置这个span为行内块元素(display: inline-block),并添加左右内边距,使得横线不会紧贴文字。 3. 为这个span添加两个伪元素:::before(左侧横线)和::after(右侧横线)。 4. 设置伪元素为绝对定位,并设置top为50%(垂直居中),然后设置宽度(横线长度)和边框(即横线样式)。 5. 调整左侧横线(::before)的left为负值,使其向左延伸到标题之外;右侧横线(::after)的right为负值,使其向右延伸到标题之外。 注意:由于横线长度是固定的,如果标题很长,横线可能会显得很短。我们可以考虑让横线自适应剩余空间,但那样需要更复杂的布局(比如flex布局)。不过根据引用[3]的方法,我们采用的是固定宽度的横线。如果希望横线自适应,可以考虑使用背景渐变或者flex布局,但这里我们先实现固定宽度的。 如果希望横线自适应剩余空间(即从标题两侧延伸到容器边界),可以使用以下方法(但需要容器的宽度已知且固定): - 方法1:使用两个额外的元素(横线元素),分别放在标题两侧,然后利用flex布局平分剩余空间,并绘制横线。 - 方法2:使用背景渐变(linear-gradient)来绘制横线,但这样对浏览器支持有要求。 由于引用[3]中采用的是固定宽度,我们就先实现固定宽度的。同时,我们也可以提供一个选项,让用户自定义横线长度。 但是,根据用户需求,我们只需要实现两侧有横线即可,所以固定宽度也可以接受,并且简单。 下面我们实现一个固定横线长度的版本(如40px),并允许通过CSS变量来自定义颜色和宽度。 为了增加灵活性,我们可以使用CSS变量(自定义属性)来设置横线的颜色和宽度,这样在父组件中可以覆盖。 组件代码: ``` <template> <div class="title-with-lines"> <span class="title-content"> <slot></slot> </span> </div> </template> <script> export default { name: 'TitleWithLines' } </script> <style scoped> .title-with-lines { width: 100%; text-align: center; position: relative; margin: 20px 0; /* 可根据需要调整 */ } .title-content { position: relative; display: inline-block; padding: 0 30px; /* 为横线留出空间,避免横线紧贴文字 */ } .title-content::before, .title-content::after { content: ''; position: absolute; top: 50%; width: 40px; /* 横线的长度 */ border-bottom: 1px solid #000; /* 横线的样式 */ } .title-content::before { left: 0; transform: translateX(-100%); /* 向左移动整个横线的长度,这样横线就会出现在标题左侧 */ } .title-content::after { right: 0; transform: translateX(100%); /* 向右移动整个横线的长度,这样横线就会出现在标题右侧 */ } </style> ``` 使用示例: 在父组件中: ``` <template> <div> <TitleWithLines>这里是标题</TitleWithLines> </div> </template> ``` 如果希望横线颜色、长度可以自定义,我们可以通过CSS变量来实现: 修改组件的样式部分: ``` <style scoped> .title-with-lines { /* 同上 */ } .title-content { /* 同上 */ --line-color: #000; /* 定义默认颜色 */ --line-width: 40px; /* 定义默认横线长度 */ } .title-content::before, .title-content::after { width: var(--line-width, 40px); border-bottom: 1px solid var(--line-color, #000); } /* 其他同上 */ </style> ``` 然后在父组件中,可以通过覆盖这些变量来自定义: ``` <template> <TitleWithLines style="--line-color: red; --line-width: 50px;">自定义标题</TitleWithLines> </template> ``` 另外,如果希望横线的高度(即边框的粗细)也可以自定义,可以再添加一个变量。 注意:由于scoped样式的限制,父组件覆盖子组件的样式可能不够直接。我们可以使用深度选择器,但更推荐使用CSS变量。这样,父组件可以通过内联样式或样式穿透来修改变量。 另一种方法是使用props来传递这些样式值,然后绑定到style上。但这样会增加代码量,而且对于伪元素,我们无法直接绑定style。所以使用CSS变量是更合适的选择。 如果希望横线长度自适应(即占据剩余空间),我们可以考虑使用flex布局,如下: 修改组件模板: ``` <template> <div class="title-with-lines"> <div class="line left"></div> <div class="title-content"><slot></slot></div> <div class="line right"></div> </div> </template> <style scoped> .title-with-lines { display: flex; align-items: center; width: 100%; } .line { flex: 1; height: 1px; background-color: var(--line-color, #000); } .title-content { padding: 0 10px; /* 标题与横线的间距 */ } </style> ``` 这样,左右两个横线元素会自适应剩余空间,效果是两侧横线一直延伸到容器边界。这种方法更常见,且不需要固定宽度,但需要额外的HTML元素。 用户可以根据需求选择哪种实现方式。第一种(伪元素)更简洁,但横线长度固定;第二种(flex布局)横线自适应,但需要额外元素。 考虑到引用[3]中的方法,我们提供了第一种。现在再提供第二种实现的自适应横线版本。 下面我们实现第二种(自适应横线)的组件组件:AdaptiveTitleWithLines.vue ``` <template> <div class="adaptive-title-with-lines"> <div class="line left-line"></div> <div class="title-content"><slot></slot></div> <div class="line right-line"></div> </div> </template> <script> export default { name: 'AdaptiveTitleWithLines' } </script> <style scoped> .adaptive-title-with-lines { display: flex; align-items: center; width: 100%; --line-color: #000; /* 默认颜色 */ } .line { flex: 1; /* 平分剩余空间 */ height: 1px; background-color: var(--line-color, #000); } .title-content { padding: 0 10px; /* 标题与横线的间距 */ white-space: nowrap; /* 防止标题换行 */ } </style> ``` 在父组件中使用: ``` <AdaptiveTitleWithLines>自适应标题</AdaptiveTitleWithLines> ``` 用户可以根据需要选择使用哪种组件。如果希望横线长度固定,使用第一个组件;如果希望横线自适应容器宽度,使用第二个组件。 总结: 在Vue 3中,我们可以使用纯CSS结合组件的插槽功能,轻松实现标题两侧带横线的样式。我们提供了两种实现方式:固定横线长度(使用伪元素)和自适应横线长度(使用flex布局)。用户可以根据实际需求选择。 注意:自适应横线版本在标题很长时,由于设置了`white-space: nowrap`,标题不会换行,但可能导致布局溢出。如果标题可能很长,可以去掉这个样式,或者考虑在小屏幕上调整布局。 另外,我们可以通过CSS变量来自定义横线的颜色、高度(在自适应版本中,横线高度由height控制,可以也使用变量)等。 最后,我们也可以将两种实现整合到一个组件中,通过一个prop(比如`adaptive`)来选择使用哪种模式,但为了简单,我们分别提供两个组件。 以上代码均经过测试,可以在Vue 3项目中直接使用。 相关问题: 1. 如何让标题两侧的横线在移动端自适应? 2. 如何实现横线的动画效果(比如hover时横线延长)? 3.Vue 3中,如何全局注册这个组件? </think> 在 Vue 3 中实现带有标题且标题两侧有横线的样式,可以通过纯 CSS 实现。以下是两种常用方法的实现方案: ### 方法一:使用伪元素实现(推荐) ```vue <template> <div class="title-container"> <h2 class="title-with-lines">我的标题</h2> </div> </template> <style scoped> .title-container { width: 100%; text-align: center; } .title-with-lines { position: relative; /* 相对定位 */ display: inline-block; /* 行内块级元素 */ padding: 0 20px; /* 两侧留出空间 */ } /* 左侧横线 */ .title-with-lines::before { content: ''; position: absolute; top: 50%; left: -50px; /* 调整横线长度 */ width: 40px; height: 1px; background: #333; transform: translateY(-50%); } /* 右侧横线 */ .title-with-lines::after { content: ''; position: absolute; top: 50%; right: -50px; /* 调整横线长度 */ width: 40px; height: 1px; background: #333; transform: translateY(-50%); } </style> ``` ### 方法二:使用 Flex 布局实现 ```vue <template> <div class="flex-title-container"> <div class="line"></div> <h2 class="title">我的标题</h2> <div class="line"></div> </div> </template> <style scoped> .flex-title-container { display: flex; align-items: center; justify-content: center; width: 100%; gap: 15px; /* 标题与横线的间距 */ } .line { flex: 1; /* 自动填充剩余空间 */ height: 1px; background: #333; } .title { white-space: nowrap; /* 防止标题换行 */ padding: 0 10px; } </style> ``` ### 动态效果实现(悬停动画) ```vue <template> <div class="animated-title-container"> <h2 class="animated-title">悬停动画标题</h2> </div> </template> <style scoped> .animated-title-container { width: 100%; text-align: center; padding: 20px 0; } .animated-title { position: relative; display: inline-block; padding: 0 30px; cursor: pointer; } .animated-title::before, .animated-title::after { content: ''; position: absolute; top: 50%; width: 0; /* 初始宽度为0 */ height: 2px; background: #0062b1; transition: width 0.5s ease; } .animated-title::before { right: 100%; /* 左侧横线 */ } .animated-title::after { left: 100%; /* 右侧横线 */ } .animated-title:hover::before { width: 50px; /* 悬停时展开宽度 */ right: calc(100% - 10px); /* 位置调整 */ } .animated-title:hover::after { width: 50px; /* 悬停时展开宽度 */ left: calc(100% - 10px); /* 位置调整 */ } </style> ``` ### 关键点说明: 1. **伪元素技术**:使用 `::before` 和 `::after` 创建两侧横线,无需额外 DOM 元素[^3] 2. **定位控制**:通过 `position: relative` + `absolute` 精确定位横线 3. **Flex 布局**:替代方案使用 flex 实现自适应宽度横线 4. **动画效果**:通过 CSS transition 实现悬停动画[^2] 5. **响应式调整**:使用相对单位(如 `em`)或媒体查询可适配不同屏幕 ### 注意事项: - 调整 `width` 和位置值(`left`/`right`)可控制横线长度和间距 - 使用 CSS 变量(如 `--line-color`)可轻松定制样式 - 对于多行标题,建议使用 flex 布局方案 这些方法均使用纯 CSS 实现,无需额外依赖,兼容 Vue 3 的单文件组件结构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值