Vue3留言墙项目——主体部分静态、mock

news2025/1/11 20:39:05

文章目录

    • 主体头部
    • 主体关键部分
      • 小卡片组件
      • 创建mock数据以及使用

主体头部

在这里插入图片描述在这里插入图片描述

主体部分显示的内容,根据头部点击的是留言墙还是照片墙的按钮,显示不同的内容。

将照片墙和留言墙要渲染的数据抽取到一个js中,在导入的Main.vue(主体页面)中渲染。

将页面中的文字记录在src/utils/data.js

// 墙的性质
// 这样记录后wallType[0]为留言墙内容 wallType[1]为照片墙内容
export const wallType = [
  {
    name: "留言墙",
    slogan: "很多事情值得记录,当然也值得回味。",
  },
  {
    name: "照片墙",
    slogan: "很多事情值得记录,当然也值得回味。",
  },
];

// 分类标签
// label[0]为留言墙内容 label[1]为照片墙内容
export const label = [
  [
    "留言",
    "目标",
    "理想",
    "过去",
    "将来",
    "爱情",
    "亲情",
    "秘密",
    "信条",
    "无题",
  ],
  [
    "我",
    "ta",
    "喜欢的",
    "有意义的",
    "值得纪念的",
    "母校",
    "生活",
    "天空",
    "我在的城市",
    "大海",
  ],
];

根据id渲染照片墙或留言墙& 点击标签样式切换 实现这两个功能的Main.vue代码为:

<template>
  <div class="main">
    <div class="message">
      <p class="name">{{ wallType[id].name }}</p>
      <p class="slogan">{{ wallType[id].slogan }}</p>
    </div>

    <div class="labels">
      <ul>
        <li :class="{ liselected: liIndex == -1 }" @click="changeIndex(-1)">
          全部
        </li>
        <li
          v-for="(item, index) in label[id]"
          :key="index"
          @click="changeIndex(index)"
          :class="{ liselected: liIndex == index }"
        >
          {{ item }}
        </li>
      </ul>
    </div>
  </div>
</template>

<script>
import { wallType, label } from "@/utils/data";
import { ref } from "vue";
export default {
  setup() {
    let id = ref(0); // 留言墙id为0 之后做事件使得id为1
    let liIndex = ref(-1); // 当前选中状态小li的下标
    const changeIndex = (index) => {
      liIndex.value = index;
    };
    return {
      wallType,
      label,
      id,
      liIndex,
      changeIndex,
    };
  },
};
</script>

<style lang="scss" scoped>
.main {
  margin-top: 52px;
  .message {
    padding-top: 46px;
    .name {
      font-size: 56px;
      color: $gray-1;
      font-weight: 600;
    }
    .slogan {
      font-size: 14px;
      color: $gray-3;
      padding-bottom: 44px;
    }
  }

  .labels {
    padding: 0 400px;
    ul {
      display: flex;
      justify-content: space-around;
      align-items: center;

      li {
        font-size: $font-14;
        color: $gray-3;
      }
      .liselected {
        display: flex;
        align-items: center;
        justify-content: center;
        width: 56px;
        height: 28px;
        border: 1px solid rgba(32, 32, 32, 1);
        border-radius: 14px;
        color: $gray-1;
      }
    }
  }
}
</style>

主体关键部分

主体部分渲染许多留言卡片

小卡片组件

卡片组件有不同的背景颜色,当前时间 留言标签,跟主体部分的label对应,主要留言内容,点赞数量,评论数量,发表人。

数据:
卡片背景颜色
时间
标签
内容
点赞数量
评论数量
发表人

这些数据可以通过Mock出来,不过这里先静态写死好样式,再mock

⭐️实现效果:
在这里插入图片描述

代码:components/MyNote/MyNote.vue

<template>
  <div class="my-note">
    <div class="top">
      <span class="time">2022.11.20</span>
      <span class="label">留言</span>
    </div>
    <p class="content">
      这是一段暖心的话,它或许不长,但是它是我现在最想说的。放在这里就留一个纪念吧,不用回头看,应为现在才是当下最好的。这是一段暖心的话,它或许不长,但是它是我现在最想说的。
    </p>
    <div class="bottom">
      <div class="left">
        <div class="like">
          <i class="iconfont icon-xiai"></i>
          <span>12</span>
        </div>
        <div class="comment">
          <i class="iconfont icon-liuyan"></i>
          <span>4</span>
        </div>
      </div>

      <span class="right">Zemoz</span>
    </div>
  </div>
</template>

<script>
export default {};
</script>

<style lang="scss" scoped>
.my-note {
  width: 288px;
  height: 240px;
  background: rgba(255, 227, 148, 0.3);
  padding: 10px $pd-20;
  box-sizing: border-box;

  .top {
    display: flex;
    justify-content: space-between;
    font-size: $font-12;
  }

  .content {
    font-size: $font-14;
    text-align: left;
    padding: $pd-20 0;
  }

  .bottom {
    display: flex;
    justify-content: space-between;
    padding-top: 30px;

    .left {
      display: flex;
      .like {
        margin-right: $pd-8;
      }

      .iconfont {
        color: $gray-3;
        margin-right: $pd-4;
      }

      span {
        color: $gray-3;
        font-size: $font-14;
      }
    }

    .right {
      font-size: $font-14;
      color: $gray-1;
    }
  }
}
</style>

Main.vue中使用

<template>
  <div class="main">
    <main class="mainbody">
      <my-note-vue></my-note-vue>
    </main>
  </div>
</template>

<script>
import { wallType, label } from "@/utils/data";
import { ref } from "vue";
import MyNoteVue from "@/components/MyNote/MyNote.vue";
export default {
  components: {
    MyNoteVue,
  },
};
</script>
<style>
.mainbody {
	 padding: 30px;
}
</style>

创建mock数据以及使用

yarn add mockjs --save
src/mock/index.js

let Mock = require("mockjs");

// 留言note
export const note = Mock.mock({
  "data|19": [
    {
      // 创建时间
      moment: new Date(),
      // id
      "id|+1": 1,
      // userid
      "userId|+1": 10,
      // 内容
      "message|24-96": "@cword",
      // 标签label
      "label|0-9": 0,
      // name
      name: "@cname",
      // like
      "like|0-120": 0,
      // 评论
      "comment|0-120": 0,
      // 背景颜色
      "imgurl|0-4": 0,
      // 是否撤销
      "revoke|0-20": 0,
      // 是否举报
      "report|0-20": 0,
      //   类型
      type: 0,
    },
  ],
});

显示效果为:
在这里插入图片描述

此时Main.vue

<template>
  <div class="main">
    <div class="message">
      <p class="name">{{ wallType[id].name }}</p>
      <p class="slogan">{{ wallType[id].slogan }}</p>
    </div>

    <div class="labels">
      <ul>
        <li :class="{ liselected: liIndex == -1 }" @click="changeIndex(-1)">
          全部
        </li>
        <li
          v-for="(item, index) in label[id]"
          :key="index"
          @click="changeIndex(index)"
          :class="{ liselected: liIndex == index }"
        >
          {{ item }}
        </li>
      </ul>
    </div>

    <main class="mainbody">
      <div class="blocks">
        <my-note-vue
          v-for="(item, i) in note.data"
          :key="i"
          :note="item"
          class="note"
        ></my-note-vue>
      </div>
    </main>
  </div>
</template>

<script>
import { wallType, label } from "@/utils/data";
import { ref } from "vue";
import MyNoteVue from "@/components/MyNote/MyNote.vue";
import { note } from "@/mock/index";
export default {
  components: {
    MyNoteVue,
  },
  setup() {
    let id = ref(0); // 留言墙id为0 之后做事件使得id为1
    let liIndex = ref(-1); // 当前选中状态小li的下标
    const changeIndex = (index) => {
      liIndex.value = index;
    };
    return {
      wallType,
      label,
      id,
      liIndex,
      changeIndex,
      note,
    };
  },
};
</script>

<style lang="scss" scoped>
.main {
  box-sizing: border-box;
  margin-top: 52px;
  // width: 1500px;
  // margin: auto;
  .message {
    padding-top: 46px;
    .name {
      font-size: 56px;
      color: $gray-1;
      font-weight: 600;
    }
    .slogan {
      font-size: 14px;
      color: $gray-3;
      padding-bottom: 44px;
    }
  }

  .labels {
    padding: 0 400px;
    ul {
      display: flex;
      justify-content: space-around;
      align-items: center;

      li {
        font-size: $font-14;
        color: $gray-3;
        // transition: all 0.3s;
      }
      .liselected {
        display: flex;
        align-items: center;
        justify-content: center;
        width: 56px;
        height: 28px;
        border: 1px solid rgba(32, 32, 32, 1);
        border-radius: 14px;
        color: $gray-1;
      }
    }
  }

  .mainbody {
    padding-top: 30px;
    width: 99%;
    margin: auto;
    box-sizing: border-box;
    .blocks {
      width: calc(100% + 12px);
      margin-left: -12px;
      display: flex;
      flex-wrap: wrap;
      .note {
        margin-bottom: 10px;
        margin-left: 12px;
      }
    }
  }
}
</style>

MyNote.vue

<template>
  <div class="my-note">
    <div class="top">
      <span class="time">2022.11.20</span>
      <span class="label">{{ label[card.type][card.label] }}</span>
    </div>
    <p class="content">
      {{ card.message }}
    </p>
    <div class="bottom">
      <div class="left">
        <div class="like">
          <i class="iconfont icon-xiai"></i>
          <span>{{ card.like }}</span>
        </div>
        <div class="comment">
          <i class="iconfont icon-liuyan"></i>
          <span>{{ card.comment }}</span>
        </div>
      </div>

      <span class="right">{{ card.name }}</span>
    </div>
  </div>
</template>

<script>
import { label } from "@/utils/data";
import { toRef, onMounted } from "vue";
export default {
  props: ["note"],
  setup(props) {
    let card = toRef(props, "note");
    onMounted(() => {
      console.log(card);
    });

    return {
      label,
      card,
    };
  },
};
</script>

<style lang="scss" scoped>
.my-note {
  width: 288px;
  height: 240px;
  background: rgba(255, 227, 148, 0.3);
  padding: 10px $pd-20;
  box-sizing: border-box;

  .top {
    display: flex;
    justify-content: space-between;
    font-size: $font-12;
  }

  .content {
    font-size: $font-14;
    text-align: left;
    padding-top: $pd-20;
    width: 100%;
    height: 140px;
  }

  .bottom {
    display: flex;
    justify-content: space-between;
    padding-top: $pd-20;

    .left {
      display: flex;
      .like {
        margin-right: $pd-8;
      }

      .iconfont {
        color: $gray-3;
        margin-right: $pd-4;
      }

      span {
        color: $gray-3;
        font-size: $font-14;
      }
    }

    .right {
      font-size: $font-14;
      color: $gray-1;
    }
  }
}
</style>

具体改动代码——可查看gitee

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/21309.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[go]汇编ASM简介

文章目录汇编(ASM)寄存器帧指针FP常见指令函数示例生成汇编Go汇编代码主要用于优化和与底层系统交互&#xff0c;并不会像其它的经典汇编代码那样独立运行。汇编(ASM) Go ASM是一种被Go编译器使用的特殊形式的汇编语言&#xff08;伪汇编&#xff09;&#xff0c;它基于Plan9输…

记录一次Powerjob踩的坑(Failed to deserialize message)

一. 问题描述: 在本地开发环境, server端和worker都运行正常. 但是发布到SIT环境(容器)的时候, 服务端却监测不到worker(worker可以找到服务端) 二. 问题表现: 1.服务端看不到Worker信息 2. 服务端日志信息 : Failed to deserialize message from [akka://oms111.111.111…

ECMAScript modules规范示例详解

引言 很多编程语言都有模块这一概念&#xff0c;JavaScript 也不例外&#xff0c;但在 ECMAScript 2015 规范发布之前&#xff0c;JavaScript 没有语言层面的模块语法。模块实际上是一种代码重用机制&#xff0c;要实现代码重用&#xff0c;将不同的功能划分到不同的文件中是必…

pycharm安装并加载编译器,设置背景图片,手把手详细操作

pycharm安装并加载编译器&#xff0c;设置背景图片&#xff0c;手把手详细操作 pycharm社区版&#xff08;免费&#xff09;下载官网 双击安装包&#xff0c;选择安装路径 勾选这两个&#xff0c;其实全不勾也没事 下一步默认就行&#xff0c;点install 安装完成后&#xf…

mimikatz抓取密码实战

必须下载最新版本 Releases gentilkiwi/mimikatz GitHubhttps://github.com/gentilkiwi/mimikatz/releases 有32和64之分&#xff0c;systeminfo查看自己版本 首先我们用后门得到权限&#xff0c;在用getsystem提权&#xff0c;因为mimikatz要system权限&#xff0c;getuid…

Python基础-1-环境搭建(初体验)

一&#xff1a;开发环境 Linux-5.15.0&#xff08;Ubuntu22.04&#xff09; 二&#xff1a;安装Python3 1、安装&#xff1a;sudo apt-get install python3 2、版本查询&#xff1a; python3 --version python3进入python解释器也可查询对应版本&#xff0c;按CtrlD或执行…

力扣(LeetCode)20. 有效的括号(C++)

栈模拟 一次遍历字符串 sss &#xff0c; 遇到左括号则入栈&#xff0c;遇到右括号则匹配栈顶。如果右括号匹配成功 &#xff0c; 栈顶元素弹栈 &#xff0c; 匹配不成功 &#xff0c; 则 returnfalsereturn\ \ falsereturn false 。 提示 : 当遍历完所有字符&#xff0c;记…

【计算机网络】扩展以太网方法总结

注&#xff1a;最后有面试挑战&#xff0c;看看自己掌握了吗 文章目录物理层扩展以太网链路层扩展以太网网桥网桥分类透明网桥源路由网桥多接口网桥----以太网交换机直通式交换机存储转发式交换机冲突域与广播域&#x1f343;博主昵称&#xff1a;一拳必胜客 &#x1f338;博主…

LinkedList详解

介绍 众所周知ArrayList底层数据结构是数组&#xff0c;但是数组有个缺点&#xff0c;虽然查询快&#xff0c;但是增删改会慢因为数组是在连续的位置上面储存对象的应用。当我们删除某一个元素的时候在他后面的元素的索引都会左移&#xff0c;导致开销会很大。所以LinkedList应…

Linux系统下交叉编译工具的安装实现

大家好&#xff0c;今天主要和大家聊一聊&#xff0c;如何使用Linux系统下的交叉编译工具链的方法。 目录 第一:交叉编译工具链基本简介 ​第二&#xff1a;交叉编译工具安装方法 ​第三&#xff1a;安装相关库 ​第四&#xff1a;交叉编译工具验证 第一:交叉编译工具链基…

0100 蓝桥杯真题03

import java.util.Scanner; /* * 题目描述 * 如下图所示&#xff0c;3 x 3 的格子中填写了一些整数。 --*---- |10* 1|52| --****-- |20|30* 1| *******-- | 1| 2| 3| ------ *我们沿着图中的星号线剪开&#xf…

【Redis-04】Redis两种持久化方式(RDB和AOF)

Redis是基于内存的数据结构服务器&#xff0c;保存了大量的键值对数据&#xff0c;所以持久化到磁盘是非常必要的&#xff0c;Redis提供了两种持久化的方式&#xff0c;分别是RDB和AOF。下面我们看下这两种持久化方式的具体实现原理。 1.RDB持久化 首先&#xff0c;RDB持久化方…

Mysql基础

Mysql基础1. 数据库相关概念1.1 数据库1.2 数据库管理系统1.3 常见的数据库管理系统1.4 SQL2. Mysql的安装2.1 MySQL数据模型3. SQL概述3.1 SQL简介3.2 通用语法3.3 SQL分类4. DDL:操作数据库4.1 数据库的显示讲解4.2 查询4.3 创建数据库4.4 删除数据库4.5 使用数据库4.6 小结5…

linux Qt编译自己的动态库(.so),详细全流程

本篇记录Qt编译动态库全流程 1. 建立工程 首先&#xff0c;打开Qt&#xff0c;新建C Library 工程 点击choose之后&#xff0c;输入项目名称为Example&#xff0c;一直下一步即可 生成的项目里边有三个文件&#xff0c;分别是example.h, Example_global.h, example.cpp exam…

数据结构之:递归思想

&#xff08;一&#xff09;递归概念 将复杂问题 递推分解为最简问题 然后将结果回归的过程 Windows - Linux Linux Linux is not Unix 使用方法&#xff1a; 自己调用自己&#xff08;二&#xff09;斐波那契数列 兔子问题 有一对大兔子 每个月繁衍 一对小兔子&#xff08;一…

【Java 设计模式】UML 之类图

UML 之类图前言&#xff1a;什么是 UML &#xff1f;1 类图概念2 类的表示方式3 类与类之间关系的表示方式3.1 关联关系3.1.1 单向关联3.1.2 双向关联3.1.3 自关联3.2 聚合关系3.3 组合关系3.4 依赖关系3.5 继承关系3.6 实现关系前言&#xff1a;什么是 UML &#xff1f; 定义…

Linux 软件包下载加速工具:APT Proxy

本篇文章将继续介绍这个仅有 2MB 身材大小的 Linux 软件包缓存和加速工具&#xff1a;APT Proxy。 相比老牌的 apt cacher ng 而言&#xff0c;除了尺寸更小、内存占用更低&#xff08;10M以内&#xff09;、它还拥有无需配置&#xff0c;开箱即用等特点。 写在前面 年中的时…

!与~有什么区别

目录 将整型数据转换为二进制的函数 利用函数查看&#xff01;与~之后的数据有何不同 以一个非0数据作为例子 以0作为例子 我们都知道&#xff01;与~都是用于取反的。那么这两个有什么区别呢&#xff1f; 我们百度结果如下&#xff0c;很明显&#xff0c;八股文。我接下…

element-ui时间选择器(DatePicker )数据回显

系列文章目录 第一篇【element-ui】table表格底部合计自定义配置 目录 前言 一、element-ui时间选择器&#xff08;DatePicker &#xff09;是什么&#xff1f; DatePicker 日期选择器 二、返回数据格式 1.引入 总结 前言 需求&#xff1a;element-ui时间选择器&#…

【报错】QT Release NO CMAKE_CXX_COMPILER could be found

NO CMAKE_CXX_COMPILER could be found 错误&#xff1a; Tell CMake where to find the compiler by setting either the environmentvariable "CC" or the CMake cache entry CMAKE_C_COMPILER to the full path tothe compiler, or to the compiler name if it …