乐趣区

小白在react+dva+antd中踩的一些坑

记录下来,一来给自己提醒,二来帮助一些朋友们解决问题。大部分都是很傻的坑,但就是踩了,orz
样式方面

1)、使用 antd 的 table 想要改变 td 的样式,比如想要显示不完时省略
下图中 2 是官方文档的写法,当我们想要改变 td 样式时可以自己写一个 render,见 1

2. 逻辑方面

用的是 dva,先简要概括一些 model 里各个的用法:
namespace:唯一
state: 初始化数据
subscriptions: 路由变化,拿页面最初始数据 监听
effects: 请求数据 处理异步 action
reducers: 更新数据

1)、想向后端发送一个请求,得到返回值后再提交另一个请求,像 promise.then 一样。
错误思路:
一开始很傻地直接前后写了两个 dispatch,结果错误,虽然分前后顺序调用了接口(dispatch 是同步执行的),可是并没有根据第一个 dispatch 的结果动态调用第二个接口。

解决方法:
在 model 里的 effects 中相关的函数里调用第二个接口

所以使用 effects 的 put 来触发 action。

首先用 dispatch 向后端发起第一个请求,

接着在 effects 里 addAddressable 函数里调用第二个请求

model.js:

2)、如何在 effects 里获取 state 里维护的值
如上图,payload 里需要 sate 里的 deviceName、description 等根据前面的图应该知道应该用 select 可是网上大概有两种方法:const todos = yield select(state => state.todos);const {id} = yield select(_=>_.storeIf) storeIf 是 model 的 namespace
我使用第一种获取不到,原因还不知道。所以如果法一获取不到,不妨用法二
const {deviceName,description,templateDetail} = yield select(_=>_.device);
3)、如何在 render 里动态渲染不同的 div?在 render 中使用 if else 会报错

解决:使用三元运算符 a?b:c
a 是一个触发不同 div 的条件,b 是一个 div,c 是另一个 div

4)、根据后端数据动态渲染 input 数量,并且把输入值存到 state 中接受到的数据肯定是一个对象,类似:{
{
a:1
},
{
b:2
}
} 用 map 遍历得到 a,b。但接下来一个问题是动态存入数据。解决:
把后端可能要显示的字段都先在 model 的 state 中设置初始值。
我这里是可能显示 port 或者 address.
在 state 写:
{
address:””,
port:0
}
通过 [] 可以动态存入 port 或者 address

暂时遇到的就是这样了,其实准确来说也不是坑,是我在学习这个上的比较费时间的一些东西。发出来就是希望大家百度问题时看到,尽快解决,少花点时间。

退出移动版