【Web开发手礼】探索Web开发的秘密(十三)-Vue(3)好友列表、登录


前言

主要介绍了好友列表、登录界面所涉及的vue知识点!!!


好友列表

从云端API读取数据信息

首先,我们需要先下载jquery

npm install jquery

javascript 复制代码
<script>
import ContentBase from '@/components/ContentBase.vue';
import $ from "jquery";
import { ref } from 'vue'; 

export default{
    name: "UserListView",
    components: {
        ContentBase
    },
    setup(){
        let users = ref([]);
        $.ajax({
            url: "https://app165.acapp.acwing.com.cn/myspace/userlist/",
            type: "get",
            success(resp){
                console.log(resp);
            }
        });
        return{
            users
        }
    }
}
</script>

使用jQuery的ajax方法发送一个GET请求到指定的URL("https://app165.acapp.acwing.com.cn/myspace/userlist/")。在请求成功时,会执行定义的success回调函数,将服务器返回的数据resp打印到控制台。

将users作为setup()函数的返回值,使其在组件中可以通过解构或者直接使用users变量来访问这个响应式数据。

javascript 复制代码
<template>
    <ContentBase>
        <div class="card" v-for="user in users " :key="user.id">
            <div class="card-body">
                <div class="row">
                    <div class="col-1">
                        <img class="img-fluid" :src="user.photo" alt="头像">
                    </div>
                    <div class="col-11">
                        <div class="username">
                            {{ user.username }}
                        </div>
                        <div class="follow-count">
                            {{ user.followerCount }}
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </ContentBase>
</template>

<script>
import ContentBase from '@/components/ContentBase.vue';
import $ from "jquery";
import { ref } from 'vue'; 

export default{
    name: "UserListView",
    components: {
        ContentBase
    },
    setup(){
        let users = ref([]);// 创建一个响应式数据users,初始为空数组

        $.ajax({
            url: "https://app165.acapp.acwing.com.cn/myspace/userlist/",
            type: "get",
            success(resp){
                users.value = resp;// 将从服务器获取的用户数据赋值给users
            }
        });
        return{
            users
        }
    }
}
</script>

<style scoped>
img{
    border-radius: 50%;/* 圆形头像效果 */
}
.username{
    font-weight: bold;/* 用户名加粗显示 */
    height: 50%; /* 用户名和粉丝数量各占一半高度 */
}
.follow-count{
    font-size: 12px;/* 粉丝数量的字体大小 */
    color: gray;/* 粉丝数量灰色显示 */
    height: 50%;/* 用户名和粉丝数量各占一半高度 */
}

.card{
    margin-bottom: 20px;/* 卡片之间的间距 */
    cursor: pointer;/* 鼠标悬停时显示手型指示 */

}
.card:hover{
    box-shadow: 2px 2px 10px lightgray;/* 鼠标悬停时的阴影效果 */
    transition: 500ms;/* 过渡效果,让阴影变化平滑 */
}
</style>
  • :使用Vue.js的v-for指令遍历users数组中的每个用户对象,并为每个用户生成一个卡片。:key="user.id"用于Vue的虚拟DOM算法中的元素标识,确保每个用户卡片的唯一性和高效更新。
  • 图片和用户名信息:展示每个用户的头像和用户名,以及粉丝数量。
javascript 复制代码
{
    path: '/userprofile/:userId',
    name: 'userprofile',
    component: UserProfileView
  },

path: '/userprofile/:userId':定义了一个路由路径,其中:userId是动态路径参数,表示这个路由可以匹配类似 /userprofile/123 这样的URL,其中 123 是实际的用户ID。动态路径参数可以通过 $route.params.userId 在组件内部访问。

javascript 复制代码
<router-link class="nav-link" :to="{name: 'userprofile', params: {userId: 2}}">用户动态</router-link>

import { useRoute } from 'vue-router';
		<!--setup函数内部-->
		const router = useRoute();
        const userId = router.params.userId;
  • :to="{name: 'userprofile', params: {userId: 2}}"::to 是 Vue Router 的一个 prop,用来指定导航的目标路由。在这里,它指向名为 'userprofile' 的路由,并且传递了一个动态参数 userId: 2。这意味着当用户点击这个链接时,会导航到 /userprofile/2 这个路径,其中 2 是用户的ID。
  • useRoute 是 Vue Router 提供的一个钩子函数,用于在组件内部获取当前路由的信息。
  • const router = useRoute();:调用 useRoute() 后返回的 router 对象包含了当前路由的各种信息,包括 params 对象,其中包含了动态路由参数。
  • const userId = router.params.userId;:这里通过 router.params.userId 获取到了路由中动态参数 userId 的值。在这个例子中,如果当前路径是 /userprofile/2,则 userId 的值将是 2。

登录

javascript 复制代码
<template>
    <ContentBase>
        <div class="row justify-content-md-center">
            <div class="col-3">
                <form @submit.prevent="login">
                    <div class="mb-3">
                        <label for="username" class="form-label">用户名</label>
                        <input v-model="username" type="text" class="form-control" id="username" >
                    </div>
                    <div class="mb-3">
                        <label for="password" class="form-label">密码</label>
                        <input v-model="password" type="password" class="form-control" id="password">
                    </div>
                    <div class="error-message">{{ error_message }}</div>
                    <button type="submit" class="btn btn-primary">登录</button>
                </form>
            </div>
        </div>
        
    </ContentBase>
</template>

<script>
import ContentBase from '@/components/ContentBase.vue';
import { ref } from 'vue';

export default{
    name: "LoginView",
    components: {
        ContentBase
    },
    setup(){
        let username = ref('');
        let password = ref('');
        let error_message = ref('');
        const login = () => {

        }
        return{
            username: username,
            password: password,
            error_message: error_message,
            login
        }
    }
}
</script>

<style scoped>
button{
    width: 100%;
}
.error-message{
    color: red;
}
</style>
  • @submit.prevent="login":当表单提交时,调用 login 方法并阻止默认的表单提交行为。
  • 双向绑定 v-model 用于绑定 username 和 password 到输入框的值。
  • error_message 用于显示登录过程中的错误信息。
  • import { ref } from 'vue'; 引入了 Vue 3 中的 ref 函数,用于创建响应式引用。
  • setup() 是 Vue 3 中的新语法,用于设置组件的响应式数据和方法。
  • 在 setup() 中,使用 ref() 创建了 username、password 和 error_message 这三个响应式变量。
  • login() 方法定义了登录函数的空壳,需要根据实际情况填充逻辑来处理用户提交的用户名和密码。
  • return { ... } 返回了组件中需要在模板中使用的数据和方法,包括 username、password、error_message 和 login。
javascript 复制代码
import { createStore } from 'vuex'

export default createStore({
  state: {
    user: {
      username: "",
      id:'',
      firstName: '',
      lastName: ''
    }
  },
  getters: {
    fullName(state){
      return state.user.firstName + state.user.lastName;
    }
  },
  mutations: {
    updateUser(state,user){
      state.user.username = user.username;
    }
  },
  actions: {
    updateUser(context){
      let resp;
    },
  },
  modules: {
  }
})
  • 使用了 createStore 函数从 Vuex 中导入,并且这个函数被用来创建一个 Vuex 的 store 实例。
  • state 对象包含应用的状态数据。
  • 定义了一个 user 对象,包含了用户的基本信息,如 username、id、firstName 和 lastName。
  • getters 是用来从 store 中的 state 中获取数据的方法。
  • 定义了一个 fullName 的 getter,它会返回 firstName 和 lastName 拼接成的完整名字。
  • mutations 是用来修改 store 中的 state 的方法。
  • 定义了一个 updateUser 的 mutation,它接收一个 user 对象作为参数,用来更新 state.user.username。
  • actions 类似于 mutations,不同之处在于它提交的是 mutation,而不是直接变更 state。
  • updateUser action 通常用来处理异步操作,例如调用 API 后再提交 mutation。
  • modules 可以用来将 store 分割成模块,目前未定义任何模块。

Vuex store 实例包含了一个简单的 user 对象作为应用的状态,以及对应的 getters、mutations 和 actions。可以用来管理用户信息,并提供了获取完整名字和更新用户名的功能。增加更多的 state 属性、mutations 和 actions,来实现复杂的状态管理和业务逻辑。


总结

主要介绍了好友列表、登录界面所涉及的vue知识点!!!


相关推荐
To_OC7 小时前
别再串行写 await 了,Promise.all 才是并行请求的正确打开方式
前端·javascript·promise
To_OC7 小时前
LC 17 电话号码的字母组合:我的回溯算法,就是从这道题开窍的
javascript·算法·leetcode
vipbic7 小时前
中后台越做越乱后,我用插件化把它救回来了
前端·vue.js
Hyyy7 小时前
Computer Use 适合做什么,不适合做什么——一次真实使用后的思考
前端
小和尚同志8 小时前
前端 AI 单元测试思考与落地
前端·人工智能·aigc
invicinble9 小时前
c端系统,其实更像一个信息展示平台
前端
你怎么知道我是队长9 小时前
JavaScript的变量和数据类型介绍
开发语言·javascript·ecmascript
李姆斯10 小时前
管理是否可以被完全量化
前端·产品经理·团队管理
名字还没想好☜10 小时前
Next.js 中间件实战:鉴权、重定向与 A/B 分流
开发语言·前端·javascript·中间件·react·next.js
广州灵眸科技有限公司11 小时前
瑞芯微RV1126B开发板(EASY-EAI-PI2) INI文件操作
java·前端·javascript·网络·人工智能