反应交互性:编辑、过滤、条件渲染
|
|
编辑任务名称
功能 编辑任务 ( 身份证件 , 新名称 ) {
常数 编辑的任务列表 = 任务 . 地图 ( ( 任务 ) => {
//如果此任务与编辑的任务具有相同的ID
如果 ( 身份证件 === 任务 . 身份证件 ) {
//复制任务并更新其名称
返回 { ... 任务 , 名称 : 新名称 } ;
}
//如果不是编辑的任务,则返回原始任务
返回 任务 ;
} ) ;
设置任务 ( 编辑的任务列表 ) ;
}
常数 任务列表 = 任务 . 地图 ( ( 任务 ) => (
< 托多
身份证件 = { 任务 . 身份证件 }
名称 = { 任务 . 名称 }
完整的 = { 任务 . 完整的 }
钥匙 = { 任务 . 身份证件 }
切换任务已完成 = { 切换任务完成 }
删除任务 = { 删除任务 }
编辑任务 = { 编辑任务 }
/>
) ) ;
用于编辑的UI
进口 { 使用状态 } 从 “反应” ;
常数 [ 正在编辑 , 集合编辑 ] = 使用状态 ( 假 ) ;
“视图”模板,当我们只是查看待办事项时; 到目前为止,这是我们在教程中使用的。 编辑待办事项时的“编辑”模板。 我们即将创建此。
常数 编辑模板 = (
< 形式 类名 = " 堆叠小 " >
< div公司 类名 = " 表格组 " >
< 标签 类名 = " 待办事项标签 " 用于 = { 道具 . 身份证件 } > 的新名称 { 道具 . 名称 }
</ 标签 >
< 输入 身份证件 = { 道具 . 身份证件 } 类名 = " 待办事项文本 " 类型 = " 文本 " />
</ div公司 >
< div公司 类名 = " btn-群 " >
< 按钮 类型 = " 按钮 " 类名 = " btn待取消 " > 取消 < 跨度 类名 = " 视觉上的隐藏 " > 重命名 { 道具 . 名称 } </ 跨度 >
</ 按钮 >
< 按钮 类型 = " 提交 " 类名 = " btn btn_primary待编辑 " > 保存 < 跨度 类名 = " 视觉上的隐藏 " > 的新名称 { 道具 . 名称 } </ 跨度 >
</ 按钮 >
</ div公司 >
</ 形式 >
) ;
常数 视图模板 = (
< div公司 类名 = " 小堆 " >
< div公司 类名 = " c-cb型 " >
< 输入
身份证件 = { 道具 . 身份证件 }
类型 = " 复选框 "
默认选中 = { 道具 . 完整的 }
onChange(更改时) = { ( ) => 道具 . 切换任务完成 ( 道具 . 身份证件 ) }
/>
< 标签 类名 = " 待办事项标签 " html用于 = { 道具 . 身份证件 } >
{ 道具 . 名称 }
</ 标签 >
</ div公司 >
< div公司 类名 = " btn-群 " >
< 按钮 类型 = " 按钮 " 类名 = " 英国电信公司 " > 编辑 < 跨度 类名 = " 视觉上的隐藏 " > { 道具 . 名称 } </ 跨度 >
</ 按钮 >
< 按钮
类型 = " 按钮 "
类名 = " btn btn危险 "
onClick(单击) = { ( ) => 支柱 . 删除任务 ( 支柱 . 身份证件 ) } > 删除 < 跨度 类名 = " 视觉上的隐藏 " > { 道具 . 名称 } </ 跨度 >
</ 按钮 >
</ div公司 >
</ div公司 >
) ;
有条件渲染
返回 < 锂 类名 = " 待办事项 " > { 正在编辑 ? 编辑模板 : 视图模板 } </ 锂 > ;
切换 <托多/>
模板
< 按钮 类型 = " 按钮 " 类名 = " 英国电信公司 " onClick(单击) = { ( ) => 集合编辑 ( 真的 ) } > 编辑 < 跨度 类名 = " 视觉上的隐藏 " > { 道具 . 名称 } </ 跨度 >
</ 按钮 >
< 按钮
类型 = " 按钮 "
类名 = " btn待取消 "
onClick(单击) = { ( ) => 集合编辑 ( 假 ) } > 取消 < 跨度 类名 = " 视觉上的隐藏 " > 重命名 { 道具 . 名称 } </ 跨度 >
</ 按钮 >
从UI编辑
常数 [ 新名称 , 设置新名称 ] = 使用状态 ( "" ) ;
功能 处理更改 ( e(电子) ) {
设置新名称 ( e(电子) . 目标 . 价值 ) ;
}
< 输入
身份证件 = { 道具 . 身份证件 }
类名 = " 待办事项文本 "
类型 = " 文本 "
价值 = { 新名称 }
onChange(更改时) = { 处理更改 }
/>
功能 handleSubmit(处理提交) ( e(电子) ) { e(电子) . 预防违约 ( ) ; 道具 . 编辑任务 ( 道具 . 身份证件 , 新名称 ) ;
设置新名称 ( "" ) ;
集合编辑 ( 假 ) ;
}
< 形式 类名 = " 小堆 " onSubmit(提交时) = { 手柄提交 } >
功能 托多 ( 道具 ) {
常数 [ 正在编辑 , 集合编辑 ] = 使用状态 ( 假 ) ;
常数 [ 新名称 , 设置新名称 ] = 使用状态 ( "" ) ;
功能 处理更改 ( e(电子) ) {
设置新名称 ( e(电子) . 目标 . 价值 ) ;
}
功能 handleSubmit(处理提交) ( e(电子) ) { e(电子) . 预防违约 ( ) ; 道具 . 编辑任务 ( 道具 . 身份证件 , 新名称 ) ;
设置新名称 ( "" ) ;
集合编辑 ( 假 ) ;
}
常数 编辑模板 = (
< 形式 类名 = " 小堆 " onSubmit(提交时) = { handleSubmit(处理提交) } >
< div公司 类名 = " 表格组 " >
< 标签 类名 = " 待办事项标签 " html用于 = { 道具 . 身份证件 } > 的新名称 { 道具 . 名称 }
</ 标签 >
< 输入
身份证件 = { 支柱 . 身份证件 }
类名 = " 待办事项文本 "
类型 = " 文本 "
价值 = { 新名称 }
onChange(更改时) = { 处理更改 }
/>
</ div公司 >
< div公司 类名 = " btn组 " >
< 按钮
类型 = " 按钮 "
类名 = " btn待取消 "
onClick(单击) = { ( ) => 集合编辑 ( 假 ) } > 取消 < 跨度 类名 = " 视觉上的隐藏 " > 重命名 { 道具 . 名称 } </ 跨度 >
</ 按钮 >
< 按钮 类型 = " 提交 " 类名 = " btn btn_primary待编辑 " > 保存 < 跨度 类名 = " 视觉上的隐藏 " > 的新名称 { 道具 . 名称 } </ 跨度 >
</ 按钮 >
</ div公司 >
</ 形式 >
) ;
常数 视图模板 = (
< div公司 类名 = " 小堆 " >
< div公司 类名 = " c-cb型 " >
< 输入
身份证件 = { 道具 . 身份证件 }
类型 = " 复选框 "
默认选中 = { 道具 . 完整的 }
onChange(更改时) = { ( ) => 道具 . 切换任务完成 ( 道具 . 身份证件 ) }
/>
< 标签 类名 = " 待办事项标签 " html用于 = { 道具 . 身份证件 } >
{ 道具 . 名称 }
</ 标签 >
</ div公司 >
< div公司 类名 = " btn-群 " >
< 按钮
类型 = " 按钮 "
类名 = " 英国电信公司 "
onClick(单击) = { ( ) => {
集合编辑 ( 真的 ) ;
} } > 编辑 < 跨度 类名 = " 视觉上的隐藏 " > { 道具 . 名称 } </ 跨度 >
</ 按钮 >
< 按钮
类型 = " 按钮 "
类名 = " btn btn危险 "
onClick(单击) = { ( ) => 道具 . 删除任务 ( 道具 . 身份证件 ) } > 删除 < 跨度 类名 = " 视觉上的隐藏 " > { 支柱 . 名称 } </ 跨度 >
</ 按钮 >
</ div公司 >
</ div公司 >
) ;
返回 < 锂 类名 = " 待办事项 " > { is编辑 ? 编辑模板 : 视图模板 } </ 锂 > ;
}
出口 违约 托多 ;
返回过滤器按钮
创建用于存储活动过滤器的挂钩。 渲染数组 <过滤器按钮/> 元素,允许用户在all、completed和incomplete之间更改活动筛选器。
添加过滤器挂钩
常数 [ 滤波器 , 设置过滤器 ] = 使用状态 ( “全部” ) ;
定义过滤器
每个过滤器应具有唯一的名称。 每个过滤器应该具有唯一的行为。
常数 过滤器_MAP = {
全部 : ( ) => 真的 ,
活动 : ( 任务 ) => ! 任务 . 完整的 ,
完整的 : ( 任务 ) => 任务 . 完整的 ,
} ;
这个 全部 筛选器显示所有任务,因此我们返回 真的 用于所有任务。 这个 活动 筛选器显示其任务 完整的 道具是 假 . 这个 完整的 筛选器显示其任务 完整的 道具是 真的 .
常数 过滤器名称 = 对象 . 钥匙 ( 过滤器_MAP ) ;
渲染过滤器
常数 过滤器列表 = 过滤器名称 . 地图 ( ( 名称 ) => (
< 过滤器按钮 钥匙 = { 名称 } 名称 = { 名称 } />
) ) ;
< 过滤器按钮 />
< 过滤器按钮 />
< 过滤器按钮 />
{ 过滤器列表 }
交互式过滤器
我们知道 <过滤器按钮/> 应该报告它当前是否被按下,如果它的名称与过滤器状态的当前值匹配,则应该按下。 我们知道 <过滤器按钮/> 需要回调才能设置活动筛选器。 我们可以直接利用我们的 设置过滤器 挂钩。
常数 过滤器列表 = 过滤器名称 . 地图 ( ( 名称 ) => (
< 过滤器按钮
钥匙 = { 名称 }
名称 = { 名称 }
已按下 = { 名称 === 滤波器 }
设置过滤器 = { 设置过滤器 }
/>
) ) ;
更换 全部的 具有 {props.name} . 设置的值 咏叹调 到 {props.isPressed} . 添加 onClick(单击) 调用的处理程序 props.setFilter() 使用过滤器的名称。
功能 过滤器按钮 ( 道具 ) {
返回 (
< 按钮
类型 = " 按钮 "
类名 = " btn切换-btn "
咏叹调 = { 道具 . 已按下 }
onClick(单击) = { ( ) => 道具 . 设置过滤器 ( 道具 . 名称 ) } >
< 跨度 类名 = " 视觉上的隐藏 " > 显示 </ 跨度 >
< 跨度 > { 道具 . 名称 } </ 跨度 >
< 跨度 类名 = " 视觉上的隐藏 " > 任务 </ 跨度 >
</ 按钮 >
) ;
}
出口 违约 过滤器按钮 ;
在UI中筛选任务
常数 任务列表 = 任务 . 滤波器 ( 过滤器_MAP [ 滤波器 ] )
. 地图 ( ( 任务 ) => (
< 托多
身份证件 = { 任务 . 身份证件 }
名称 = { 任务 . 名称 }
完整的 = { 任务 . 完整的 }
钥匙 = { 任务 . 身份证件 }
切换任务完成 = { 切换任务完成 }
删除任务 = { 删除任务 }
编辑任务 = { 编辑任务 }
/>
) ) ;