第六节:Vue3 开发WordPress设置选项 - 添加对象传值和数据校验

承接上一节,我们使用 Vite 对JS资源进行打包后,优化了不少性能,但也有不少麻烦还没有解决,这次来做个收尾。

  • 本系列代码分享在 GitHub 中,希望能帮助大家理解
  • github.com/muze-page/vu

流程

多对象传值

在上一节的 Option.vue 文件中,有这样的代码

  1. const datas = reactive({
  2. dataOne:"",
  3. dataTwo:"",
  4. dataName:[],
  5. dataImage:"",
  6. dataSelectedImage:"",
  7. });

看起来没啥问题,但我现在需要开发2个 Tab 选项,每个选项中都有3个选项需要填写,类似这样

  1. let datas = reactive({
  2. npc_zfb_appid:"",
  3. npc_zfb_private_key:"",
  4. npc_zfb_public_key:"",
  5. npc_wx_mch_id:"",
  6. npc_wx_cert_api:"",
  7. npc_wx_cert_key:"",
  8. });

嗯,还是没啥问题,但是,我要是有10个 Tab 选项呢?

如果你只是低头跑,你总会撞上山的

聪明的你想到了,可以这样啊

  1. let datas = reactive({
  2. zfb:{
  3. npc_zfb_appid:"",
  4. npc_zfb_private_key:"",
  5. npc_zfb_public_key:"",
  6. },
  7. wx:{
  8. npc_wx_mch_id:"",
  9. npc_wx_cert_api:"",
  10. npc_wx_cert_key:"",
  11. },
  12. npc_refund_user:[],
  13. });

有其他需求再接着分,或者分了再分。

这当然没问题,但我们的获取选项的接口就不够用了,
需要修改 interface.php 文件中的函数 get_option_by_RestAPI() 为以下内容

  1. //读取Option
  2. //支持数组类数据请求
  3. function get_option_by_RestAPI($data)
  4. {
  5. // 将输入数据转换成数组类型
  6. $dataArray = json_decode($data->get_body(),true);
  7. $return = array();
  8. // 遍历数组,检查每个元素是否为对象
  9. foreach($dataArray as $option_name => $value){
  10. // 初始化当前选项的值数组
  11. $option_value = array();
  12. // 如果当前元素是一个非空数组,则遍历其中的每个字段
  13. if(is_array($value)&&!empty($value)){
  14. foreach($value as $field_name => $field_value){
  15. // 获取指定选项的值,如果不存在,则使用空字符串代替
  16. $option_value[$field_name]= get_option($field_name,'');
  17. }
  18. // 将当前选项及其值添加到返回数组中
  19. $return[$option_name]= $option_value;
  20. }else{
  21. // 如果当前元素非数组或数组为空,获取指定选项的值
  22. $return[$option_name]= get_option($option_name,'');
  23. }
  24. }
  25. return $return;// 返回所有选项的键值对
  26. }

这里面进行了若干次判断,并进行对应的处理,以保证我们可以正常是使用上面提到的数据结构。

浏览器的响应结构就是这样的

数据校验

如果我们需要的是用户名,但使用者却填写了手机号,这时,会导致拿不到需要的数据,就需要在数据提交前进行数据校验,来保证数据的正确性。

代码的使用者是一匹野马,你不能指望他按照你的想法去跨红色的栏

为了便于演示,我们使用方便的正则来进行数据校验。分别是姓名和手机号

准备数据

我们修改 Option.vue 文件,准备两个变量用来存储我们的选项值

  1. //存储选项值
  2. const datas = reactive({
  3. //省略
  4. check:{
  5. name:"",
  6. phone:"",
  7. },
  8. });

这里,我使用了结构化的数据,便于数据管理。

数据获取里也得加上

  1. //获取数据
  2. const get_option =()=>{
  3. axios
  4. .post(dataLocal.route +"pf/v1/get_option", datas,{
  5. headers:{
  6. "X-WP-Nonce": dataLocal.nonce,
  7. "Content-Type":"application/json",
  8. },
  9. })
  10. .then((response)=>{
  11. //省略
  12. datas.check.name = data.check.name;
  13. datas.check.phone = data.check.phone;
  14. })
  15. .catch((error)=>{
  16. window.alert("连接服务器失败或后台读取出错!数据读取失败");
  17. console.log(error);
  18. });
  19. };

这样,就能在页面初始加载时,拿到选项的默认值了

准备正则

我们准备两个计算属性,通过正则来判断,并输出对应的布尔值

  1. //验证名称
  2. const isName = computed(()=>{
  3. // 正则表达式验证名字,2到6个中文字符
  4. const reg =/^[u4e00-u9fa5]{2,6}$/;
  5. return reg.test(datas.check.name);
  6. });
  7. //验证电话号码
  8. const isPhone = computed(()=>{
  9. // 正则表达式验证电话号码
  10. const reg =/^1[3456789]d{9}$/;
  11. return reg.test(datas.check.phone);
  12. });

他会持续的拿到输入的值,并进行判断输出的。

准备模版

我们在模版文件中,将对应的值用上

  1. <h3>数据校验</h3>
  2. 姓名:<inputtype="text"v-model="datas.check.name"/>
  3. <pv-if="!isName"class="check">格式错误 - 必须为两字到六字中文</p>
  4. <br/>
  5. 手机号:<inputtype="text"v-model="datas.check.phone"/>
  6. <pv-if="!isPhone"class="check">格式错误 - 必须是1开头的11位手机号</p>
  7. <hr/>

这样,当拿到的值符合正则需求时,计算函数输出 true ,然后 if 反向判断为 false ,不显示警告内容。

效果

执行打包命令后,刷新 VueSpa 菜单可查看效果

提示信息的外观,我加了点小小的样式。

还有以下几点需要改进

  • 点击保存按钮进行数据校验
  • 校验通过才能正常报存
  • 将校验数据模块化,可复用

当然,基于 Node 生态,您还可以通过诸多现成的校验框架更方便的实现同样的功能。

总结

现在,前后端进行了分离,后端只需负责存储数据,前端负责准备和展示数据即可。大大提升了代码的可维护性和健壮性,降低了浏览器的性能开销。

当然,在前端工程化的路上,你还有无限多的可能,待您探索。

本系列章节核心内容到此为止,后续有更棒的想法,会持续分享给大家的。

赞(0)
未经允许不得转载:大象juǎn » 第六节:Vue3 开发WordPress设置选项 - 添加对象传值和数据校验