vue前端杂记
1、携带id跳转前端页面
import { useRoute, useRouter } from "vue-router";
const router = useRouter();
const route = useRoute();
// 跳转到会议详情
const goToMeetingDetail = (id) => {
router.push(`/conference/meeting/${id}`)
}
{
path: "meeting/:id",
component: () => import("@/views/conference/MeetingDetail.vue"),
},
const meetingId = ref(route.params.id);
2、将MarkDown文本展示出来
npm install marked
<template>
<!-- 使用v-html将转换后的HTML渲染到页面上 -->
<div v-html="htmlContent"></div>
</template>
<script setup>
import { ref, watchEffect } from 'vue'
import { marked } from 'marked'
// 假设articleResponseData.content是Markdown格式的文本
const articleResponseData = {
content: '# Hello World\nThis is a *Markdown* content.'
}
// 用ref存储渲染的HTML
const htmlContent = ref('')
// 使用watchEffect监听Markdown内容的变化,并将其转换为HTML
// 使用onMounted钩子函数,在组件加载时异步转换Markdown
onMounted(async () => {
htmlContent.value = await marked(articleResponseData.content)
})
</script>
3、转换时间格式
/ 处理时间的函数
export const getFormattedLocalTime = (now) => {
const year = now.getFullYear()
const month = String(now.getMonth() + 1).padStart(2, '0') // 月份从0开始,需要+1
const day = String(now.getDate()).padStart(2, '0')
const hours = String(now.getHours()).padStart(2, '0')
const minutes = String(now.getMinutes()).padStart(2, '0')
const seconds = String(now.getSeconds()).padStart(2, '0')
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`
}
转换方式:
<script setup>
import { computed, ref } from 'vue'
import { getFormattedLocalTime } from "@/api/common.js";
const articleResponseData = ref({
// ...其他字段
updateTime: "2023-07-15T08:30:00Z" // 假设这是后端返回的时间格式
});
// 方式1:使用计算属性(推荐)
const formattedUpdateTime = computed(() => {
// 处理可能的空值
if (!articleResponseData.value.updateTime) return '';
// 将字符串转换为Date对象
const date = new Date(articleResponseData.value.updateTime);
return getFormattedLocalTime(date);
});
// 方式2:直接在模板调用的方法
const formatTime = (timeString) => {
if (!timeString) return '';
return getFormattedLocalTime(new Date(timeString));
};
// 当从接口获取数据时(示例)
const fetchData = async () => {
const res = await getArticleData(); // 假设的API调用
articleResponseData.value = {
...res.data,
// 如果需要保持原始时间数据,可以新增一个格式化字段
formattedTime: getFormattedLocalTime(new Date(res.data.updateTime))
};
};
</script>
<template>
<!-- 使用计算属性 -->
<div>更新时间:{{ formattedUpdateTime }}</div>
<!-- 直接调用方法 -->
<div>更新时间:{{ formatTime(articleResponseData.updateTime) }}</div>
<!-- 如果新增了格式化字段 -->
<div>更新时间:{{ articleResponseData.formattedTime }}</div>
</template>
最佳实践推荐:
<script setup>
import { computed } from 'vue';
import { getFormattedLocalTime } from "@/api/common.js";
const articleResponseData = ref({
// ...初始化数据
});
// 优化后的计算属性处理
const timeInfo = computed(() => ({
createTime: formatTimestamp(articleResponseData.value.createTime),
updateTime: formatTimestamp(articleResponseData.value.updateTime)
}));
const formatTimestamp = (timestamp) => {
try {
return timestamp ? getFormattedLocalTime(new Date(timestamp)) : '--';
} catch (e) {
console.error('时间格式错误:', timestamp);
return '无效时间';
}
};
</script>
<template>
<div class="time-display">
<p>创建时间:{{ timeInfo.createTime }}</p>
<p>最后更新:{{ timeInfo.updateTime }}</p>
</div>
</template>
<style scoped>
.time-display {
color: #666;
font-size: 0.9em;
margin-top: 10px;
}
</style>
关键点说明:
- 时间处理安全
- 添加了空值判断 (
?.
操作符) - 使用 try-catch 捕获无效时间格式
- 返回默认值 (‘–’) 保持界面友好
- 响应式处理
- 使用
computed
自动追踪依赖 - 当原始时间值变化时自动更新
- 国际化扩展建议
// 在common.js添加
export const formatWithLocale = (date, locale = 'zh-CN') => {
return new Intl.DateTimeFormat(locale, {
year: 'numeric',
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit',
second: '2-digit'
}).format(date);
};
// 使用示例
const formatTimestamp = (timestamp) => {
// ...
return formatWithLocale(new Date(timestamp));
};
- 时区处理建议
// 如果后端返回UTC时间
const utcDate = new Date(timestamp + 'Z');
// 或使用库如day.js/moment-timezone
import dayjs from 'dayjs';
import utc from 'dayjs/plugin/utc';
dayjs.extend(utc);
const formatTimestamp = (timestamp) => {
return dayjs(timestamp).utc().format('YYYY-MM-DD HH:mm:ss');
};
- 性能优化
- 避免在模板中直接调用方法(每次渲染都会执行)
- 优先使用计算属性(带缓存)
- 批量处理多个时间字段
完整方案集成:
<script setup>
import { computed } from 'vue';
import dayjs from 'dayjs';
import utc from 'dayjs/plugin/utc';
dayjs.extend(utc);
const articleResponseData = ref({
// ...初始化数据
});
const timeInfo = computed(() => ({
createTime: formatTime(articleResponseData.value.createTime),
updateTime: formatTime(articleResponseData.value.updateTime)
}));
const formatTime = (timestamp) => {
if (!timestamp) return '--';
try {
// 带时区转换的格式化
return dayjs(timestamp)
.utc()
.format('YYYY-MM-DD HH:mm:ss');
// 或者使用原生Date
// return getFormattedLocalTime(new Date(timestamp));
} catch (e) {
console.warn('时间格式化失败:', timestamp);
return '无效时间';
}
};
</script>
这种实现方式可以:
- 自动处理UTC时间转换
- 提供友好的错误提示
- 兼容不同的时间格式输入
- 保持响应式更新
- 方便扩展多语言支持
使一个元素在不影响其他元素的情况下,靠在最右
可以使用 Flex 布局实现右对齐效果,修改容器为 flex 容器并添加 margin-left: auto
到编辑按钮。修改后的代码如下:关键:display: flex; align-items: center+margin-left: auto
<div style="background-color: #efeeee">
<!-- 添加 display: flex 到这一层 -->
<div style="display: flex; align-items: center">
<span style="background-color: rgb(251, 127, 127); color: white">{{
articleResponseData.articleType
}}</span>
<span
style="margin-left: 20px; margin-right: 20px; cursor: pointer"
>{{ userInfo.username }}</span
>
<span
v-html="'已于 ' + formattedUpdateTime + ' 修改'"
></span>
<!-- 这里添加 margin-left: auto -->
<span style="cursor: pointer; margin-left: auto">编辑</span>
</div>
<div v-for="(tag, index) in tags" :key="index" class="hot-item">
<el-text>文章标签:</el-text>
<el-button style="color: blue">{{ tag.name }}</el-button>
</div>
</div>
关键修改点:
- 在包含编辑按钮的父级容器添加
display: flex
- 在编辑按钮的样式添加
margin-left: auto
- 建议添加
align-items: center
保持内容垂直居中
4、将网站的顶部导航栏设置为不随页面滚动而被遮挡
一、使用固定定位(Fixed Positioning)
通过 position: fixed
将导航栏固定在视口顶部,并设置 z-index
保证其位于其他内容之上。
实现代码示例:
.navbar {
position: fixed;
top: 0;
left: 0;
width: 100%;
z-index: 999; /* 确保导航栏在最上层 */
background: #fff; /* 可选背景色 */
box-shadow: 0 2px 5px rgba(0,0,0,0.1); /* 可选阴影效果 */
width: 100%;
}
同时,为避免导航栏遮挡页面主体内容,需给页面内容容器添加顶部内边距或外边距:
body {
padding-top: 100px; /* 根据导航栏实际高度调整 */
}
此方法适用于需要导航栏始终可见的场景,如电商网站或长页面浏览。
二、使用粘性定位(Sticky Positioning)
通过 position: sticky
实现导航栏在滚动到特定位置时固定,灵活性更高:
.navbar {
position: sticky;
top: 0;
z-index: 999;
}
此方法适合导航栏初始位置在页面中上部(而非绝对顶部)的情况,例如带横幅的页面布局。
三、调整页面内容的间距
若导航栏未固定但需要避免遮挡,可通过以下方式调整内容位置:
- 外间距法:为内容容器添加
margin-top
:.content { margin-top: 80px; /* 与导航栏高度匹配 */ }
- 内边距法:为页面主体添加
padding-top
(推荐):body { padding-top: 80px; }
这两种方法均能避免内容被遮挡,但需确保数值与导航栏实际高度一致。
四、处理锚点跳转的遮挡问题
当用户通过导航栏内的链接跳转到页面内锚点时,使用 scroll-margin-top
属性为目标元素预留空间:
.target-section {
scroll-margin-top: 100px; /* 等于导航栏高度 */
}
此属性会在滚动到目标元素时自动留出顶部空间,避免被固定导航栏遮挡。
五、响应式设计适配
针对移动端等小屏幕设备,可通过媒体查询调整导航栏样式:
@media (max-width: 768px) {
.navbar {
position: static; /* 取消固定定位 */
/* 其他样式调整(如折叠菜单) */
}
body {
padding-top: 0; /* 移除顶部间距 */
}
}
此方法确保在不同设备上导航栏与内容的协调性。
总结建议
- 优先方案:固定定位(
position: fixed
)配合padding-top
调整内容间距,适合大多数需导航栏常显的场景。 - 进阶优化:结合
scroll-margin-top
处理锚点跳转,提升用户体验。 - 注意事项:务必测试导航栏的
z-index
值,避免被其他元素覆盖;移动端需考虑折叠菜单等响应式设计。