使用一个包 jwt-decode
安装:
npm i jwt-decode
引入:
import { jwtDecode } from 'jwt-decode';
使用:
const access_obj = jwtDecode(access);
返回的一个对象,可以打印出来看下属性。
使用一个包 jwt-decode
安装:
npm i jwt-decode
引入:
import { jwtDecode } from 'jwt-decode';
使用:
const access_obj = jwtDecode(access);
返回的一个对象,可以打印出来看下属性。
事件函数的编写需要在 export default{} 中的 setup() 函数中例如:
setup(props) {
let fullname = computed(() => props.user.firstName + ' ' + props.user.lastName);
const follow = () => {
console.log("follow");
}
const unFollow = () => {
console.log("unfollow");
}
return {
fullname,
follow,
unFollow,
}
}
注意,写的函数要return出去才可以使用
使用样例:
<button v-on:click="follow" v-if="!user.is_followed" type="button" class="btn btn-secondary btn-sm">follow</button>
<button v-on:click="unFollow" v-if="user.is_followed" type="button" class="btn btn-secondary btn-sm">un-follow</button>
使用 v-on:click 绑定事件函数,其中 v-on: 可以简写为 @ 例如:
<button @click="follow" v-if="!user.is_followed" type="button" class="btn btn-secondary btn-sm">follow</button>
<button @click="unFollow" v-if="user.is_followed" type="button" class="btn btn-secondary btn-sm">un-follow</button>
触发父组件的函数:
使用 context.emit() ,例如:
setup(props, context) {
let fullName = computed(() => props.user.lastName + ' ' + props.user.firstName);
const follow = () => {
context.emit('follow');
};
const unfollow = () => {
context.emit("unfollow");
}
return {
fullName,
follow,
unfollow,
}
}
和上一个 setup 相比,这里需要传一个上下文 context 然后使用 context.emit 来绑定
注意:这里的props和context是由位置决定的,不是由名字决定的,所以假如在没有用到props时,想绑定事件,也依旧要传一个props。
父组件中template:
<UserProfileInfo @follow="handlefollow" @unFollow="handleunFollow" :user="user"/>
context.emit 绑定的事件名称就是 @ 后面的名称,所以只要一一对应就行,也可以不和函数名称相同。 = 后面的就是触发的函数。这些被触发的函数同样写在 setup 中,也同样需要被return出去,例如:
setup() {
const user = reactive({
id: 1,
username: "heky",
lastName: "he",
firstName: "ky",
followerCount: 999,
is_followed: false,
});
const handlefollow = () => {
console.log("u");
};
const handleunFollow = () => {
console.log("u")
}
return {
user,
handlefollow,
unFollow,
}
}
假如有传递参数,就在 context.emit() 再多传一个参数
例如:
const post_a_post = () => {
context.emit('post_a_post', content.value);
content.value = "";
}
而对应的触发事件需要加一个传入的形参,
例如:
const post_a_post = (content) => {
posts.count ++;
posts.posts.unshift({
id: post_a_post.count,
user_id: 1,
content: content,
})
}
setup(props, context)
:初始化变量、函数
ref
定义变量,可以用.value
属性重新赋值reactive
定义对象,不可重新赋值,当他的值发生改变(一般是对象中的某一个属性改变)会将有使用这个对象的组件重新渲染一遍。props
存储父组件传递过来的数据context.emit()
:触发父组件绑定的函数vue 中通过 setup() 函数来初始化变量。setup函数写在 export default {} 中,可以用 setup = () => {} 即箭头函数的写法,也可以直接写作 setup()
例子:
export default {
name: 'UserProfileView',
components: {
ContentBase,
UserProfileInfo,
UserProfilePosts
},
setup() {
const user = reactive({
id: 1,
username: "heky",
lastName: "he",
firstName: "ky",
followerCount: false,
});
return {
user,
}
}
}
这个例子中定义了一个user的变量对象,里面放着5各变量,之后将要用到的变量对象 user return出去
之后可以在子组件的标签中用 v-bind: 来绑定
例如:
<UserProfileInfo v-bind:user="user"/>
v-bind: 也可以省略为 : ,例如:
<UserProfileInfo :user="user"/>
等号后面的冒号可以传入一个表达式,这里将 user 传入
之后要在组件中使用,需要将用到的组件放到 export default{} 中 props 中 props 是一个对象。
例如:
export default {
name: "UserProfileInfo",
props: {
user: {
type: Object,
required: true,
},
}
}
其中user也是作为一个对象来写,有两个值,一个是类型,另外一个是是否需要。
这样写完之后就可以在 template 中用了,使用时用两个大括号括起来 {{}}
例如:
<div class="username">{{ user.username }}</div>
<div class="fans">fans: {{ user.followerCount }}</div>
如果想作为属性的值进行使用,可以在对应的属性前面加上 : ,
例如:
<img :src="user.photo" alt="" class="img-fluid" >
这里的 user.photo 是一个变量而不是当作一个字符串,作用于src这个属性,所以src前面加上一个冒号( : 是 v-bind: 的简写)
如果需要对变量进行计算然后实现动态变化,需要在组件中设置一个新的变量,以及用到vue中的 computed 函数
例如:
import { computed } from 'vue';
export default {
name: "UserProfileInfo",
props: {
user: {
type: Object,
required: true,
},
},
setup(props) {
let fullname = computed(() => props.user.firstName + ' ' + props.user.lastName);
return {
fullname
}
}
}
这里setup函数传入一个变量props表示当前组件的props,然后在里面定义了一个新的变量 fullname 调用 computed 函数动态计算变量的值,注意 computed 函数接收一个函数,之后也是一样将要用到的变量return出去就可以了。
在template中使用:
<div class="username">{{ fullname }}</div>
使用 v-model 属性获取html标签内的内容示例:
<template>
<textarea v-model="content" class="form-control" id="edit-post" rows="3"></textarea>
</template>
<script>
import { ref } from 'vue';
export default {
name: "UserProfileWrite",
setup() {
let content = ref("");
return {
content,
}
}
}
</script>
变量对象可以用 reactive ,单个变量可以使用 ref 。示例中使用 v-model 将textarea中的内容绑定到content这个变量中,之后要取得这个值可以用 content.value 来取。之后如果要修改这个值也可以直接对 content.value 进行赋值。
注:其实用 reactive 也是可以赋值的,不过是对对象中的属性赋值,一般如果变量是对象就用 reactive 否则可能就用 ref
安装 @vue/cli-plugin-router 插件
在 router 文件夹中的 index.js 中将路由添加到 routes 数组中例如:
const routes = [
{
path: '/',
name: 'home',
component: HomeView
},
{
path: '/login',
name: 'login',
component: LoginView
},
{
path: '/register',
name: 'register',
component: RegisterView
},
{
path: '/404',
name: '404',
component: NotFoundView
},
]
注意:有使用到的组件要import进index.js中
重定向示例:
{
path: '/:catchAll(.*)',
redirect: '/404/',
}
:catchAll() 是关键字,括号里面接收正则表达式,这里的 . 表示任意字符, 表示任意多个 .* ,
redirect 表示重定向的链接。
使用参数的示例:
{
path: '/userprofile/:userId/',
name: 'userprofile',
component: UserProflieView
}
这里 userId 是一个变量,在要当作变量的路由前面加上 : 即可。
在组件中使用路由参数,需要使用 useRoute 组件
示例:
import { useRoute } from 'vue-router';
export default {
name: 'UserProfileView',
components: {
ContentBase,
},
setup() {
const route = useRoute();
console.log(route.params.userId);
}
对应的跳转:
<router-link class="nav-link" :to="{name: 'userprofile', params: {userId : 2,}}">用户动态</router-link>
需要在params对象中添加对应的参数。
<router-link class="navbar-brand" :to="{name: 'home', params: {}}">Myspace</router-link>
router-link 是vue中的一个组件,使用 : + 名称绑定属性,这里绑定一个to属性表示要跳转的组件,里面是一个对象,对象一个key是name,表示组件的名称
在函数中使用跳转示例:
import router from '@/router/index'
success() {
router.push({name: 'userlist'});
},
使用 router 的 push api 里面传的参数是一个对象,和 router-link 中 :to 是一样的。
使用 <router-view />
表示这个标签通过链接的不同渲染不同的组件。
一般放在 App.vue 中, 例如:
<template>
<NavBar />
<router-view />
</template>
这里 NavBar 一直保持不变, router-view 根据链接的不同渲染不同页面。
一般链接中可能会带有参数,例如 /userprofile/65 、 /userprofile/32 ,如果想要严格判断完整的路径可以给 router-view 加一个属性 :key="$route.fullPath"
例如:
<template>
<NavBar />
<router-view :key="$route.fullPath"/>
</template>
如果不加的话,/userprofile/65 、 /userprofile/32 这两个页面可能显示一样的内容。(比如先访问 /userprofile/65 后访问 /userprofile/32 ,可能页面还是 /userprofile/65 的内容而不是 /userprofile/32 的内容,原因就是只匹配 userprofile 这个路径,而没有匹配后面的参数 )。
虽然退了,但是想要收鸡的心情却一直不消减,刚一直在刷论坛看到中了claw的另外一款vps,然后果断私聊,然后狠狠剁手😭。
之后打算慢慢把博客搬迁到新的vps上,然后现在博客在的这个vps就放生掉吧,(不然真的养不起那么多vps了😭