本文记录 Vue3 的学习过程,内容为用户动态页面设计。
1. 实现用户信息模块
用户动态页面可以划分为三个模块:用户信息部分、发动态部分(如果是自己才有发动态功能)、历史动态展示部分,因此我们可以用三个组件来实现(在 components
目录下创建 UserNewsInfo.vue
、UserNewsSend.vue
以及 UserNewsPosts.vue
三个组件)。
其中 UserNewsInfo
内容如下:
1 | <template> |
UserNewsPosts
内容如下:
1 | <template> |
然后我们在 UserNewsView
中先将这两个组件添加进去:
1 | <template> |
现在我们的网页是静态的,用户头像、名字这些内容应该都是参数,每个用户是不一样的,且用户发动态后需要在历史动态组件中展示,因此这几个组件都是需要数据交互的。
一般情况下我们会将数据存到需要交互的这几个组件的最顶层组件中,即 UserNewsView
。我们可以使用 setup()
函数初始化变量,当前页面的用户一般是不会变的,因此可以定义一个 reactive
,注意 reactive
只能接收对象。未来我们需要在模板中用到的属性都需要从 setup()
函数中 return
出去。在 UserNewsView
中传递数据给 UserNewsInfo
:
1 | <template> |
Vue 中传递数据的方式类似于 React,父组件通过 props
传递属性给子组件,子组件通过调用函数(事件)给父组件传递信息。可以使用 :
或 v-bind:
给子组件绑定属性,其后是一个表达式而非普通字符串。子组件需要将接受的数据放在 props
中,接受的 user
数据类型为 Object
,且是必填的 required
。
如果某个数据是动态被计算出来的可以使用 computed
。在 UserNewsInfo
中接收并使用数据:
1 | <template> |
2. 实现关注用户功能
当没有关注当前用户时才会显示加关注的按钮,否则应该显示取消关注按钮。我们可以使用 v-if
属性判断某个表达式是否成立,即可以判断 user.is_followed
是否为 true
来动态显示关注和取关按钮。
还有就是当我们点击按钮时需要更改 user.is_followed
的状态,需要定义一个事件处理函数并绑定(使用 v-on:click
或 @click
)到按钮的 click
属性上。
由于状态是从父组件 UserNewsView
中传过来的,因此不能直接在子组件中修改状态,而是需要在父组件中定义好函数并绑定(使用 @
)到子组件上:
1 | <template> |
然后由子组件触发绑定的函数来修改父组件中的状态,其 API 为 context.emit()
,setup()
函数中可以接收第二个参数 context
:
1 | <template> |
3. 实现历史动态模块
我们先在 UserNewsView
中创建几条动态并传给 UserNewsPosts
子组件:
1 | <template> |
在子组件 UserNewsPosts
中我们就需要循环渲染出每条动态,可以使用 v-for
实现,注意循环时类似于 React,需要绑定一个不重复的 key
属性:
1 | <template> |
4. 实现发动态模块
Vue 可以使用 v-model
获取 <textarea>
的内容并绑定到某个变量上,我们先在父组件 UserNewsView
中导入子组件 UserNewsSend
,然后创建发动态的函数传递给子组件:
1 | <template> |
最后是实现 UserNewsSend
:
1 | <template> |
我们理一下执行过程,首先点击发送按钮后会触发绑定的 UserNewsSend
组件中的 handleSend
函数,该函数会调用父组件 UserNewsView
传递过来的 send
事件,参数是 content.value
,父组件触发 send
事件后会调用其定义的 send
函数,这个函数会在父组件的 post
对象中添加数据,由于 post
对象是 reactive
类型的,因此当这个对象发生变化时,引用了该对象的组件就会重新渲染,即重新渲染 UserNewsPosts
。