(十)Vue项目——轻社区:完成侧边栏布局—用户信息+最新话题

本文详细介绍了如何在Vue.js应用中构建侧边栏组件,包括用户信息展示、热门和最新话题列表。用户信息部分考虑了登录状态,而热门话题和最新话题通过HTTP请求从服务器获取数据,展示了基本的API交互和Vue组件间的通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

侧边栏

1.侧边栏布局

2.用户信息

3.热门话题

4.最新话题


侧边栏

1.侧边栏布局

打开src\components\Sidebar.vue,编写代码。

<template>

  <div>

    <div class="mb-2">

      <UserInfo />

    </div>

    <div class="mb-2">

      <BestTopic />

    </div>

    <div>

      <NewTopic />

    </div>

  </div>

</template>

<script>

import UserInfo from '@/components/sidebar/UserInfo'

import BestTopic from '@/components/sidebar/BestTopic'

import NewTopic from '@/components/sidebar/NewTopic'

export default {

  components: { UserInfo, NewTopic, BestTopic }

}

</script>

创建src\components\sidebar\UserInfo.vue,代码如下。

<template>

  <div>

    用户信息

  </div>

</template>

创建src\components\sidebar\BestTopic.vue,代码如下。

<template>

  <div>

    热门话题

  </div>

</template>

创建src\components\sidebar\NewTopic.vue,代码如下。

<template>

  <div>

    最新话题

  </div>

</template>

页面效果如下

2.用户信息

编写src\components\sidebar\UserInfo.vue。

<template>

  <div class="model bg-light">

    <div class="modal-header">

      <h5 class="modal-title small">LightBBS</h5>

    </div>

    <div class="modal-body row" v-if="isLogin">

      <div class="col-3">

        <router-link :to="{ name: 'user' }">

          <img class="rounded" style="width:65px" :src="user.img_url">

        </router-link>

      </div>

      <div class="col-9">

        <div class="mb-2">

          <router-link class="username" :to="{ name: 'user' }">{{ user.name }}</router-link>

        </div>

        <div>

          <router-link :to="{ name: 'post' }" tag="button" class="btn btn-outline-primary btn-sm">发布主题</router-link>

        </div>

      </div>

    </div>

    <div class="modal-body text-center" v-if="isLogin === false">

      <div class="mb-2">

        <router-link :to="{ name: 'register' }" tag="button" class="btn btn-outline-secondary">现在注册</router-link>

      </div>

      <div class="small">

        已注册用户请

        <router-link :to="{ name: 'login' }">登录</router-link>

      </div>

    </div>

  </div>

</template>

<script>

import { mapState } from 'vuex'

export default {

  computed: {

    ...mapState(['isLogin'])

  },

  data () {

    return {

      user: {}

    }

  },

  created () {

    this.getProfile()

  },

  methods: {

    getProfile () {

      this.$http.get('user/profile').then(res => {

        if (res.data.code === 1) {

          this.user = res.data.data

        }

      }).catch(() => {

        this.$toastr.e('操作失败,服务器异常。')

      })

    }

  }

}

</script>

<style scoped>

.modal-header {

  padding: 0.65rem 1rem;

  border-bottom: 1px solid rgba(0, 0, 0, 0.125);

}

.username {

  color: #666;

}

.username:hover {

  color: #444;

  text-decoration: none;

}

</style>

已登录情况下的页面效果如下。

 

未登录情况下的页面效果如下

3.热门话题

打开src\components\sidebar\BestTopic.vue,编写代码。

<template>

  <div class="model bg-light">

    <div class="modal-header">

      <h5 class="modal-title small">最受欢迎的话题</h5>

    </div>

    <ul class="list-group list-group-flush">

      <li class="list-group-item bg-light small" v-for="topic in topics" :key="topic.id">

        <router-link :to="{ name: 'topic_show', params: { id: topic.id } }">{{ topic.title }}</router-link>

      </li>

    </ul>

  </div>

</template>

<script>

export default {

  data () {

    return {

      topics: [],

      size: 5

    }

  },

  created () {

    this.getBestTopic()

  },

  methods: {

    getBestTopic () {

      this.$http.get('topic/best', { params: { size: this.size } }).then(res => {

        if (res.data.code === 1) {

          this.topics = res.data.data

        }

      }).catch(() => {

        this.$toastr.e('操作失败,服务器异常。')

      })

    }

  }

}

</script>

<style scoped>

.modal-header {

  padding: 0.65rem 1rem;

  border-bottom: 1px solid rgba(0, 0, 0, 0.125);

}

.list-group-item {

  padding: 0.4rem 1.25rem;

  border: 0;

}

.list-group-item a {

  color: #666;

}

</style>

route\route.php编写服务器端路由。

Route::get('topic/best', 'api/Topic/best');

打开application\api\controller\Topic.php,编写best()方法。

public function best()

{

    $size = max(min($this->request->get('size/d', 10), 20), 1);

    $data = TopicModel::where(['is_show' => 1])->field('id,title')->order('hits', 'desc')->limit($size)->select();

    $this->success('', null, $data);

}

页面效果如下

 

打开src\components\topic\Show.vue,在id改变时加载数据。

export default {

  data () {

    ……(原有代码)

  },

  watch: {

    '$route' () {

      this.id = parseInt(this.$route.params.id) || 0

      this.getTopic()

      this.getLike()

    }

  },

  ……(原有代码)

}

4.最新话题

编写src\components\sidebar\NewTopic.vue。

<template>

  <div class="model bg-light">

    <div class="modal-header">

      <h5 class="modal-title small">最新发布的话题</h5>

    </div>

    <ul class="list-group list-group-flush">

      <li class="list-group-item bg-light small" v-for="topic in topics" :key="topic.id">

        <router-link :to="{ name: 'topic_show', params: { id: topic.id } }">{{ topic.title }}</router-link>

      </li>

    </ul>

  </div>

</template>

<script>

export default {

  data () {

    return {

      topics: [],

      size: 5

    }

  },

  created () {

    this.getBestTopic()

  },

  methods: {

    getBestTopic () {

      this.$http.get('topic/new', { params: { size: this.size } }).then(res => {

        if (res.data.code === 1) {

          this.topics = res.data.data

        }

      }).catch(() => {

        this.$toastr.e('操作失败,服务器异常。')

      })

    }

  }

}

</script>

<style scoped>

.modal-header {

  padding: 0.65rem 1rem;

  border-bottom: 1px solid rgba(0, 0, 0, 0.125);

}

.list-group-item {

  padding: 0.4rem 1.25rem;

  border: 0;

}

.list-group-item a {

  color: #666;

}

</style>

打开route\route.php,编写服务器端路由。

Route::get('topic/new', 'api/Topic/newest');

打开application\api\controller\Topic.php,编写newest()方法。

public function newest()

{

    $size = max(min($this->request->get('size/d', 10), 20), 1);

    $data = TopicModel::where(['is_show' => 1])->field('id,title')->order('id', 'desc')->limit($size)->select();

    $this->success('', null, $data);

}

页面效果如下

~~ (●ˇ∀ˇ●)~~    嘿嘿~

### Vue-Pure-Admin 中通过参数设置添加侧边栏显示的方法 在 Vue-Pure-Admin 项目中,可以通过多种方式来控制侧边栏的显示与隐藏以及动态调整其行为。以下是具体的实现方法: #### 1. 配置 `settings` 文件中的全局变量 Vue-Pure-Admin 提供了一个全局配置文件用于管理应用的行为和样式。通常位于 `src/settings/projectSetting.js` 或类似的路径下。 在这个文件中可以找到关于侧边栏的相关配置选项,例如: ```javascript // src/settings/projectSetting.js export default { menu: { isShowLogo: true, // 是否显示 Logo collapsed: false, // 菜单是否折叠,默认展开 split: false, // 是否开启菜单分组模式 accordion: true // 手风琴效果,只允许同时打开一个子菜单 }, layout: 'classic' // 页面布局风格 classic | transverse } ``` 上述代码片段展示了如何通过修改 `menu.collapsed` 和其他属性来影响侧边栏的状态[^1]。 #### 2. 动态加载路由并刷新侧边栏 如果需要动态添加新的路由到侧边栏,则需要注意路由表的变化不会自动同步至视图层。因此,在调用 `addRoutes()` 方法后,还需要手动触发侧边栏重新渲染逻辑。 具体操作如下所示: ```javascript import { resetRouter } from '@/router' function addDynamicRoute(routeConfig) { const router = useRouter() router.addRoute(routeConfig) // 刷新侧边栏数据源 store.dispatch('permission/setSidebarRouters', [...store.getters.routers, routeConfig]) // 如果当前页面未展示新路由对应的模块,需重载 Router View 组件 nextTick(() => { resetRouter() }) } ``` 此部分解决了类似于引用[2]提到的问题——即新增加的路由未能及时反映于前端界面之中[^2]。 #### 3. 自定义事件监听器处理点击动作 为了使每次选中某条目时能够传递额外的信息给父级组件或者执行特定业务逻辑,可以在 `<el-menu>` 的 `@select` 属性绑定自定义函数作为回调处理器。 下面是一个例子演示了当用户选择某个菜单项时会调用 `selectType` 函数并将该项名称发送出去: ```html <template> <el-scrollbar wrap-class="scrollbar-wrapper"> <el-menu :default-active="activeMenu" :collapse="isCollapse" @select="handleSelect"> <!-- 更多配置 --> </el-menu> </el-scrollbar> </template> <script setup lang="ts"> const handleSelect = (index:string) => { console.log(`Selected item index: ${index}`) }; </script> ``` 这里实现了类似的功能描述见引用[3][^3]。 #### 4. 替换默认 LOGO 图像资源 最后一步涉及更改应用程序顶部导航区域所使用的图标素材。按照官方文档指引,只需替换指定目录下的 SVG 文件即可完成定制化需求。 假设我们希望把原有的 Vue 徽标替换成另一个品牌标志,那么只需要将准备好的图片保存为 `vuejs-fill.svg` 并上传覆盖原有位置 `/src/icons/svg/vuejs-fill.svg` 即可生效[^4]。 --- ### 总结 综上所述,针对 Vue-Pure-Admin 框架内的侧边栏相关设定主要围绕以下几个方面展开讨论:一是利用预设 JSON 对象调节整体外观特性;二是结合实际场景灵活运用编程技巧解决潜在的技术难题;三是借助插槽机制增强交互体验感;四是简单便捷地实施视觉层面的品牌统一工作流。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值