訊息列是一個與「訊息」一起使用的工具列
包含以下元件
訊息列
名稱 | 類型 | 預設值 | 描述 |
---|---|---|---|
colors | 物件 | ||
colors.bgIos | 字串 | 'bg-white dark:bg-black' | |
colors.bgMaterial | 字串 | 'bg-md-light-surface dark:bg-md-dark-surface' | |
colors.borderIos | 字串 | 'border-[#c8c8cd] dark:border-white dark:border-opacity-30' | |
colors.inputBgIos | 字串 | 'bg-transparent' | |
colors.inputBgMd | 字串 | 'bg-md-light-surface-2 dark:bg-md-dark-surface-variant' | |
colors.placeholderIos | 字串 | 'dark:placeholder-white dark:placeholder-opacity-40' | |
colors.placeholderMd | 字串 | 'placeholder-md-light-on-surface-variant dark:placeholder-md-dark-on-surface-variant' | |
colors.toolbarIconIos | 字串 | 'fill-primary dark:fill-md-dark-primary' | |
colors.toolbarIconMd | 字串 | 'fill-black' | |
component | 字串 | 'div' | 元件的 HTML 元素 |
disabled | 布林值 | 未定義 | 設定 "textarea" 的 "disabled" 屬性 |
id | 字串 | 訊息列 id 屬性 | |
left | 字串 | 訊息列「左側」區域的內容 | |
leftClass | 字串 | 額外的左側樣式 | |
name | 字串 | 訊息列名稱 | |
outline | 布林值 | false | 呈現外部細線 (邊框)。如果未指定,將為 iOS 主題啟用 |
placeholder | 字串 | 數字 | '訊息' | 訊息列預留位置 |
right | 字串 | 訊息列「右側」區域的內容 | |
rightClass | 字串 | 額外的右側樣式 | |
size | 字串 | 數字 | textarea 原生 "size" 屬性的值 | |
style | CSSProperties | 額外的訊息列類別 | |
textareaId | 字串 | Textarea "id" 屬性 | |
value | 任何 | 訊息列的值 |
名稱 | 類型 | 描述 |
---|---|---|
change | 函數(e) |
|
input | 函數(e) |
|
名稱 | 描述 |
---|---|
left | 訊息列「左側」區域的內容 |
right | 訊息列「右側」區域的內容 |
<template><k-page class="ios:bg-white ios:dark:bg-black messages-page"><k-navbar title="Messages" /><k-messages><k-messages-title><b>{{ currentDay }}</b>, {{ currentTime }}</k-messages-title><k-messagev-for="(message, index) in messagesData":key="index":type="message.type":name="message.name":text="message.text"><template v-if="message.type === 'received'" #avatar><imgalt="avatar"class="w-8 h-8 rounded-full":src="message.avatar"/></template></k-message></k-messages><k-messagebarplaceholder="Message":value="messageText"@input="onMessageTextChange"><template #left><k-link toolbar icon-only><k-icon><template #ios><CameraFill class="w-7 h-7" /></template><template #material><MdCameraAltclass="w-6 h-6 fill-black dark:fill-md-dark-on-surface"/></template></k-icon></k-link></template><template #right><k-linktoolbar:style="{opacity: inputOpacity,cursor: isClickable ? 'pointer' : 'default',}"@click="onClick"><k-icon><template #ios><ArrowUpCircleFill class="w-7 h-7" /></template><template #material><MdSend class="w-6 h-6 fill-black dark:fill-md-dark-on-surface" /></template></k-icon></k-link></template></k-messagebar></k-page></template><script>import { ref, onMounted, watch, nextTick } from 'vue';import {kPage,kNavbar,kNavbarBackLink,kMessagebar,kMessages,kMessage,kMessagesTitle,kIcon,kLink,} from 'konsta/vue';import { CameraFill, ArrowUpCircleFill } from 'framework7-icons/vue';import MdCameraAlt from '../components/MdCameraAlt.vue';import MdSend from '../components/MdSend.vue';export default {components: {kPage,kNavbar,kNavbarBackLink,kMessagebar,kMessages,kMessage,kMessagesTitle,kIcon,kLink,CameraFill,ArrowUpCircleFill,MdCameraAlt,MdSend,},setup() {const messageText = ref('');const isClickable = ref(false);const inputOpacity = ref(0.3);const onMessageTextChange = (e) => {messageText.value = e.target.value;isClickable.value = messageText.value.trim().length > 0;};watch(messageText, (newValue) => {inputOpacity.value = newValue ? 1 : 0.3;});const messagesData = ref([{type: 'sent',text: 'Hi, Kate',},{type: 'sent',text: 'How are you?',},{type: 'received',text: 'Hi, I am good!',avatar: 'https://cdn.framework7.io/placeholder/people-100x100-9.jpg',},{name: 'Blue Ninja',type: 'received',text: 'Hi there, I am also fine, thanks! And how are you?',avatar: 'https://cdn.framework7.io/placeholder/people-100x100-7.jpg',},{type: 'sent',text: 'Hey, Blue Ninja! Glad to see you ;)',},{type: 'sent',text: 'How do you feel about going to the movies today?',},{type: 'received',text: ' Oh, great idea!',avatar: 'https://cdn.framework7.io/placeholder/people-100x100-9.jpg',},{type: 'received',text: ' What cinema are we going to?',avatar: 'https://cdn.framework7.io/placeholder/people-100x100-9.jpg',},{name: 'Blue Ninja',type: 'received',text: 'Great. And what movie?',avatar: 'https://cdn.framework7.io/placeholder/people-100x100-7.jpg',},{name: 'Blue Ninja',type: 'received',text: 'What time?',avatar: 'https://cdn.framework7.io/placeholder/people-100x100-7.jpg',},]);const scrollToBottom = (animate = true) => {const pageEl = document.querySelector('.messages-page');pageEl.scrollTo({top: pageEl.scrollHeight - pageEl.offsetHeight,behavior: animate ? 'smooth' : 'auto',});};onMounted(() => scrollToBottom(false));watch(messagesData, () => {scrollToBottom();});const handleSendClick = () => {const text = messageText.value.replace(//g, '<br>').trim();const type = 'sent';const messagesToSend = [];if (text.length) {messagesToSend.push({text,type,});console.log(messagesToSend);}if (messagesToSend.length === 0) {return;}messagesData.value.push(...messagesToSend);messageText.value = '';nextTick(() => {scrollToBottom();});};const onClick = () => {if (isClickable.value) {handleSendClick();}};const dateFormatter = new Intl.DateTimeFormat('en-US', {weekday: 'long',month: 'short',day: 'numeric',});const timeFormatter = new Intl.DateTimeFormat('en-US', {hour12: false,hour: '2-digit',minute: '2-digit',});const currentDate = new Date();const currentDay = dateFormatter.format(currentDate);const currentTime = timeFormatter.format(currentDate);return {onClick,messageText,messagesData,onMessageTextChange,handleSendClick,inputOpacity,isClickable,currentDay,currentTime,};},};</script>