本文记录 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。