20240918uniapp学习工作-自定义控件

中秋假期回来,继续.

默认插槽设置默认值

通过插槽完成了内容的定制, 传什么显示什么, 但是如果不传, 则是空白.

封装组件时, 可以为预留的插槽提供默认内容.

<slot>默认内容</slot>

后面具名插槽等内容项目中暂时没见用到, 就先不看了, 精力有限, 用到再来研究.

vue系列之 插槽(Slot) 详解-阿里云开发者社区 (aliyun.com)
 

继续看同事封装的控件

<template>
	<view class="bg-white margin-b-10" @click="click">
		<view class="border-b padding-5 flex-row-nowrap flex-justify-sb">
			<view class="text-indent">
				<text v-if="card.head">{{card.head.name}} : {{card.head.value}}</text>
			</view>
			<view class="text-right margin-r-10">
				<text class="title margin-r-5" v-html="getStatusName()"></text>
				<uni-icons type="right" size="18"></uni-icons>
			</view>
		</view>
	</view>
</template>

其中

.flex-row-nowrap {
		display: flex;弹性布局,能够扩展和收缩 flex 容器内的元素, 以最大限度地填充可用空间.可以自动适配各种设备的不同宽度,而不必依赖于传统的块状布局和浮动定位.
		flex-wrap: nowrap;flex 的元素被摆放到到一行,这可能导致 flex 容器溢出
	}

flex布局有点忘了,复习下,岁数大了,学啥都记不住.

别再用 float 布局了,flex 才是未来!-腾讯云开发者社区-腾讯云 (tencent.com)

flex布局有几个核心概念,分别是: 主轴与交叉轴、起始线和终止线、flex 容器与 flex 容器项.

在 flex 布局中有一个名为 flex-direction 的属性, 可以取四个值, 分别是:

  • row
  • row-reverse
  • column
  • column-reverse

row 或这 row-reverse, 主轴就是横向 x 轴, 交叉轴就是竖向 y 轴.

起始线和终止线

过去 css 的书写模式主要认为是水平从左到右的,现在不再假设一行文字是从左上开始向右下书写的.

如果 flex-direction 是 row, 并且我是在书写英文, 那么主轴的起始线是左边, 终止线是右边. 

如果书写阿拉伯文,

起始线和终止线决定了 flex 容器中的 flex 元素从哪个方向开始排列. 例如, 如果通过 direction:ltr 设置了文字书写方向是从左到右, 那么起始线就是左边, 终止线就是右边. 此时, 如果我们设置的 flex-direction 值是 row, 那么 flex 元素将会从左到右开始排列. 但如果我们设置的 flex-direction 值是 row-reverse, 那么 flex 元素将会从右到左开始排列.

也就是 flex-direction 决定了从起始线还是从终止线开始排列吧.

flex 容易与 flex 元素

把一个容器的 display 属性值改为 flex 或者 inline-flex 之后, 该容器就变成了 flex 容器, 而容器中的直系子元素就会变为 flex 元素. 那我们这段代码里第三行的view就是 flex 容器, 它的两个直系子元素就是 flex 元素.

<template>
	<view class="bg-white margin-b-10" @click="click">
		<view class="border-b padding-5 flex-row-nowrap flex-justify-sb">
			<view class="text-indent">
				<text v-if="card.head">{{card.head.name}} : {{card.head.value}}</text>
			</view>
			<view class="text-right margin-r-10">
				<text class="title margin-r-5" v-html="getStatusName()"></text>
				<uni-icons type="right" size="18"></uni-icons>
			</view>
		</view>
	</view>
</template>

Flex 核心属性

flex-direction 主轴方向

flex 伸缩系数及初始值

justify-content 主轴方向对齐

align-items 交叉轴方向对齐

下面代码及效果

.box {
  display: flex;
  flex-direction: row-reverse;
}

<div class="box">
  <div>One</div>
  <div>Two</div>
  <div>Three</div>
</div>

flex 伸缩系数及初始值

flex 布局可以很方便地进行响应式布局, 其实就是通过 flex 属性来实现的. flex 属性即 flex-grow、flex-shrink、flex-basis 这三个参数的缩写形式:

flex-grow: 1;
flex-shrink: 1;
flex-basis: 200px;
/* 上面的设置等价于下面 flex 属性的设置 */
flex: 1 1 200px;

在考虑这几个属性的作用之前, 需要先了解一下可用空间 available space 这个概念. 这几个属性的作用其实是改变了 flex 容器中的可用空间的行为.

假设在 1 个 500px 的容器中,我们有 3 个 100px 宽的元素,那么这 3 个元素需要占 300px 的宽,剩下 200px 的可用空间。在默认情况下,flexbox 的行为会把这 200px 的空间留在最后一个元素的后面。

如果期望这些元素能自动地扩展去填充满剩下的空间,那么我们需要去控制可用空间在这几个元素间如何分配,这就是元素上的那些 flex 属性要做的事。

flex-basis

flex-basis 属性用于设置 Flex 元素的大小,其默认值是 auto。此时浏览器会检查元素是否有确定的尺寸,如果有确定的尺寸则用该尺寸作为 Flex 元素的尺寸,否则就采用元素内容的尺寸。

flex-grow 若被赋值为一个正整数,flex 元素会以 flex-basis 为基础,沿主轴方向增长尺寸。这会使该元素延展,并占据此方向轴上的可用空间(available space)。如果有其他元素也被允许延展,那么他们会各自占据可用空间的一部分。

举个例子,上面的例子中有 a、b、c 3个 Flex 元素。如果我们给上例中的所有元素设定 flex-grow 值为 1,容器中的可用空间会被这些元素平分。它们会延展以填满容器主轴方向上的空间。

但很多时候,我们可能都需要按照比例来划分剩余的空间。此时如果第一个元素 flex-grow 值为 2,其他元素值为 1,则第一个元素将占有 2/4(上例中,即为 200px 中的 100px), 另外两个元素各占有 1/4(各 50px)。

flex-shrink

flex-grow 属性是处理 flex 元素在主轴上增加空间的问题,相反 flex-shrink 属性是处理 flex 元素收缩的问题。如果我们的容器中没有足够排列 flex 元素的空间,那么可以把 flex 元素 flex-shrink 属性设置为正整数,以此来缩小它所占空间到 flex-basis 以下。

与flex-grow属性一样,可以赋予不同的值来控制 flex 元素收缩的程度 —— 给flex-shrink属性赋予更大的数值可以比赋予小数值的同级元素收缩程度更大。

justify-content 主轴方向对齐

justify-content 属性用来使元素在主轴方向上对齐, 它的初始值是 flex-start, 即元素从容器的起始线排列. justify-content 属性有如下5个不同的值:

  • flex-start: 从起始线开始排列, 默认值.
  • flex-end: 从终止线开始排列
  • center: 在中间排列
  • space-around: 每个元素左右空间相等.
  • space-between: 把元素排列好之后, 剩余的空间平均分配到元素之间.

flex-start:

flex-end:

center:

space-around:

space-between:

align-items 交叉轴方向对齐

align-items 属性可以使元素在交叉轴方向对齐,它的初始值是 stretch,即拉伸到最高元素的高度。align-items 属性有如下 5 个不同的值:

  • stretch: 拉伸到最高元素的高度,默认值
  • flex-start: 按 flex 容器起始位置对齐
  • flex-end: 按 flex 容器结束位置对齐
  • center: 居中对齐
  • baseline: 始终按文字基线对齐

stretch:

flex-start:

flex-end:

center:

要注意的是,无论 align-items 还是 justify-content,它们都是以主轴或者交叉轴为参考的,而不是横向和竖向为参考的,明白这点很重要。

Flex 默认属性

由于所有 CSS 属性都会有一个初始值,所以当没有设置任何默认值时,flex 容器中的所有 flex 元素都会有下列行为:

  • 元素排列为一行 (flex-direction 属性的初始值是 row)。
  • 元素从主轴的起始线开始。
  • 元素不会在主维度方向拉伸,但是可以缩小。
  • 元素被拉伸来填充交叉轴大小。
  • flex-basis 属性为 auto。
  • flex-wrap 属性为 nowrap。

估计很快还会忘, 需要了再学.

现在这个就能看懂了,

.flex-justify-sb {
		justify-content: space-between;把元素排列好之后,剩余的空间平均分配到元素之间
	}

继续看自定义控件

<template>
	<view class="bg-white margin-b-10" @click="click">
		<view class="border-b padding-5 flex-row-nowrap flex-justify-sb">
			<view class="text-indent">
				<text v-if="card.head">{{card.head.name}} : {{card.head.value}}</text>
			</view>
			<view class="text-right margin-r-10">
				<text class="title margin-r-5" v-html="getStatusName()"></text>
				<uni-icons type="right" size="18"></uni-icons>
			</view>
		</view>
	</view>
</template>

上面第四行的 text-intent 是下面的样式:

.text-indent {
		text-indent: 10px;属性定义一个块元素首行文本内容之前的缩进量。
	}

下面这句中的 v-if 比较熟悉了,就是 card.head 为真这个 text 就会渲染出来, 否则就不会渲染.

<text v-if="card.head">{{card.head.name}} : {{card.head.value}}</text>

后面的几个样式:

.text-right {
		text-align: right; 右对齐
	}
.margin-r-10 {
		margin-right: 10px;右外边距10px
	}

v-html 的内容直接作为普通 HTML 插入.

今天就学到这里了. 累了.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值