Vue2黑马人力资源项目1(表单校验)

文章讲述了在Vue.js项目中如何使用el-form组件进行表单验证,包括prop和v-model的区别、设置必填和格式校验规则,以及自定义验证逻辑。还介绍了数据持久化和使用Vuex进行状态管理的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用模板中的icon图标

 <div class="dashboard-text">name: {{ name }}</div>
    <!--使用图标组件 <svg-icon />,已经全局注册过-->
    <!--设置iconClass属性=“文件名(没有后缀)”,去icons文件夹下找-->

    <svg-icon icon-class="example" />
  </div>

给表单增加验证

1.给form表单添加rules验证 ref属性 model双向绑定

 <!--给form表单添加验证 ref属性 model双向绑定-->
        <el-form ref="form" :rules="loginRules" :model="loginForm">

script代码

export default {
  name: 'Login',
  data() {
    return {
      loginForm: {
        mobile: '',
        password: '',
        isAgree: false
      },

      loginRules: {
        mobile: [
          {
            // 必填校验
            required: true,
            message: 'must input'
          },
          {
            // 格式校验
            pattern: /^1[3-9]\d{9}$/,
            message: '格式不对',
            // 触发校验方式
            trigger: 'blur'

          }
        ],
        password: [],
        isAgree: []
      }

    }
    // rules与model数据的区别是:rules是数组,因为有很多条数据
  }
}

表单代码:

在这段Vue.js代码中,`prop`和`v-model`是两个不同的概念,它们共同工作实现表单输入的功能。

- `prop`:在Vue.js中,`prop`是组件的一个属性,它用于定义组件可以接受的来自父组件的数据。在这个例子中,`prop="mobile"`表明`<el-form-item>`组件期望接收一个名为`mobile`的数据属性。

- `v-model`:这是一个Vue.js的双向绑定指令,它用于在表单控件和数据模型之间同步数据。在这个例子中,`v-model="loginForm.mobile"`将输入框与`loginForm`对象中的`mobile`属性建立了双向绑定关系。这意味着输入框中输入的任何内容都会实时更新到`loginForm.mobile`属性中,而`loginForm.mobile`属性的变化也会即时反映到输入框中。

总的来说,`prop`用于组件之间的数据传递,而`v-model`用于实现表单控件与数据模型之间的双向绑定。这两个概念虽然不同,但在Vue.js中经常一起使用,以实现复杂的表单交互功能 

<el-form-item prop="mobile">
            <el-input v-model="loginForm.mobile" placeholder="please input usernames" />
          </el-form-item>
          <el-form-item prop="password">
            <el-input v-model="loginForm.password" placeholder="please input password" />
          </el-form-item>
          <el-form-item prop="isAgree">
            <el-checkbox>using accord</el-checkbox>
          </el-form-item>
          <el-button v-model="loginForm.isAgree" style="width: 350px" type="primary" block>login</el-button>
          <el-form-item />

设置账号和密码的校验规则

密码还加了show-password

<el-input v-model="loginForm.password" placeholder="please input password" show-password />

 mobile: [
          {
            // 必填校验
            required: true,
            message: 'must input',
            trigger: 'blur'
          },
          {
            // 格式校验
            pattern: /^1[3-9]\d{9}$/,
            message: '格式不对',
            // 触发校验方式
            trigger: 'blur'
          }
        ],
        password: [{
          required: true,
          message: 'must input',
          trigger: 'blur'
        },
        {
          min: 6,
          max: 16,
          message: '长度6-16',
          trigger: 'blur'

        }
        ],

设置用户是否勾选的自定义校验

绑定之后设置检验

<el-form-item prop="isAgree">
            <el-checkbox v-model="loginForm.isAgree">using accord</el-checkbox>
          </el-form-item>
isAgree: [
          // 这里需要使用自定义验证validator
          // 不用required是因为它只能检测 null undefined  ""
          {
            validator: (rule, value, callback) => {
              // rule校验规则
              // value校验的值
              // callback函数-promise resolve reject
              // calback() callback(new Error('需要勾选'))
              value ? callback() : callback(new Error('需要勾选'))
            }
          }

给登录按钮注册点击事件,对表单进行整体校验

通过ref获取from表单元素,调用已有的validate方法,对整个表单进行校验

          <el-button style="width: 350px" type="primary" block @click="login">login</el-button>
  methods: {
    login() {
      // 通过ref获取from表单元素,调用已有的validate方法,对整个表单进行校验
      this.$refs.form.validate((isOk) => {
        if (isOk) {
          alert('快速通过')
        }
      }

      )
    }
  }

总结

点击按钮调用actinons里的方法,同时传递数据,返回token,提交给mutations,mutations调用方法,将token存给state

//user.js

const state = {
  token: null
}
// 用来修改数据,要修改state里的数据,必须通过mutations
const mutations = {
  setToken(state, token) {
    state.token = token
  }
}
// 用来存放异步数据
const actions = {
  // context上下文,传入参数
  login(context, data) {
    console.log(data)
    // 提交mutations里的数据,调用context里的默认方法
    context.commit('setToken', '123456')
  }
}

index.vue

data() {
    return {
      loginForm: {
        mobile: '',
        password: '',
        isAgree: false
      },

      loginRules: {
        mobile: [
          {
            // 必填校验
            required: true,
            message: 'must input',
            trigger: 'blur'
          },
          {
            // 格式校验
            pattern: /^1[3-9]\d{9}$/,
            message: '格式不对',
            // 触发校验方式
            trigger: 'blur'
          }
        ],
        password: [{
          required: true,
          message: 'must input',
          trigger: 'blur'
        },
        {
          min: 6,
          max: 16,
          message: '长度6-16',
          trigger: 'blur'
        }
        ],
        isAgree: [
          // 这里需要使用自定义验证validator
          // 不用required是因为它只能检测 null undefined  ""
          {
            validator: (rule, value, callback) => {
              // rule校验规则
              // value校验的值
              // callback函数-promise resolve reject
              // calback() callback(new Error('需要勾选'))
              value ? callback() : callback(new Error('需要勾选'))
            }
          }
        ]
      }

    }
    // rules与model数据的区别是:rules是数组,因为有很多条数据
  },
  methods: {
    login() {
      // 通过ref获取from表单元素,调用已有的validate方法,对整个表单进行校验
      this.$refs.form.validate((isOk) => {
        if (isOk) {
          alert('快速通过')
          // 调用user.js里的actions里的异步方法login
          this.$store.dispatch('user/login', this.loginForm)
        }
      }

      )

数据持久化

调用user.js里的actions里的异步方法login

usr.js

// vuex的用户模块
// 按照需要从根据模块导入,以实现存储
import { getToken, setToken, removeToken } from '@/utils/auth'
// 用来存放数据
const state = {
  token: getToken()// 调用加括号,从缓存中读取初始值
}
// 用来修改数据,要修改state里的数据,必须通过mutations
const mutations = {
  setToken(state, token) {
    state.token = token
    // 同步到缓存
    setToken(token)
  },
  removeToken() {
    // 删除vuex的token
    state.token = null
    removeToken()
  }
}

inddex.vue

 methods: {
    login() {
      // 通过ref获取from表单元素,调用已有的validate方法,对整个表单进行校验
      this.$refs.form.validate((isOk) => {
        if (isOk) {
          alert('快速通过')
          // 调用user.js里的actions里的异步方法login
          this.$store.dispatch('user/login', this.loginForm)
        }
      }

      )
    }
  }

### 黑马大事件 Vue3 教程与资讯 #### 1. 表单校验功能 在 Vue3 中实现表单校验时,可以利用 `Element Plus` 或其他 UI 库中的验证机制来完成。常见的校验规则包括非空校验、长度校验和正则表达式校验等[^1]。 - **非空校验**: 使用 `required: true` 来设置字段必填属性,并通过 `message` 提供错误提示信息。触发方式可以通过 `trigger: 'blur'` 或者 `trigger: 'change'` 实现。 - **长度校验**: 设置最小值和最大值分别为 `min: xx` 和 `max: xx`,用于限定输入字符串的长度范围。 - **正则校验**: 利用 `pattern: 正则规则` 定义匹配模式,例如 `\S` 可以用来检测是否存在非空白字符。 - **自定义校验**: 编写回调函数作为校验逻辑的一部分,该函数接收三个参数 `(rule, value, callback)`。如果校验成功,则调用 `callback()`;若失败,则传递一个新的 `Error` 对象给 `callback(new Error('错误信息'))`。 ```javascript const validateCustomRule = (rule, value, callback) => { if (!value || !/^\S+$/.test(value)) { // 自定义正则判断 callback(new Error('请输入有效的数据')); } else { callback(); } }; ``` --- #### 2. 创建项目注意事项 当初始化一个基于 Vue3 的新项目时,需注意以下几点: - 包名应遵循小写字母命名约定,避免使用大写字母[^2]。 - 如果需要集成 Git Hook 工具如 Husky,可以在项目的根目录下安装并配置它,以便自动执行某些脚本操作(比如代码提交前运行测试)。 --- #### 3. 动态路由管理 对于复杂的管理系统而言,动态加载路由是一项重要需求。这通常涉及以下几个方面的工作内容[^3]: - 在应用启动阶段解析后台返回的角色权限列表; - 根据这些角色对应的菜单项生成前端所需的路径映射关系; - 将最终形成的路由对象注入到 Vue Router 实例当中去。 以下是简单的伪代码展示如何构建动态路由的过程: ```javascript import { createRouter, createWebHistory } from 'vue-router'; // 假设这是从服务器获取的数据结构 const routesFromServer = [ { path: '/dashboard', name: 'Dashboard', component: () => import('@/views/Dashboard.vue') }, ]; export const router = createRouter({ history: createWebHistory(), routes: [...routesFromServer], }); ``` 此外还需关注不同 URL 地址编码形式之间的差异——即所谓的 History Mode vs Hash Mode。前者提供更干净美观的链接样式但可能带来 SEO 方面挑战;后者虽然稍显冗余却兼容性更好也更容易部署上线。 --- #### 4. 生命周期钩子函数 Setup Vue3 引入 Composition API 后推荐更多地依赖组合式的编程风格而非传统选项型语法。其中 setup 是组件渲染之前被执行的第一个方法,在这里我们可以声明响应式变量或者绑定事件处理器等等。 示例代码如下所示: ```typescript <script lang="ts"> import { ref, onMounted } from 'vue'; export default { setup() { let count = ref(0); onMounted(() => { console.log(`The initial count is ${count.value}`); }); return { count }; } } </script> ``` --- #### 5. 数据持久化解决方案 Pinia 相较于 Vuex ,Pinia 更加轻量级且易于上手。其核心概念围绕 Store 展开,允许开发者轻松共享状态并在整个应用程序范围内访问它们。 下面是一个基本的例子说明怎样创建 store 并读取存储的状态: ```javascript import { defineStore } from 'pinia'; export const useCounterStore = defineStore('counter', { state: () => ({ counterValue: 0, }), actions: { increment() { this.counterValue += 1; }, }, }); ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值