【从0到1打造vue element-ui管理后台 】 第十九课 编写新增功能

250 阅读1分钟

第十九课 编写新增功能

一、编写新增按钮

 <p>
    <el-form-item size="mini">
      <el-button type="primary" @click="dialogFormVisible = true"
        >新增</el-button
      >
    </el-form-item>
</p>

二、编写新增弹窗el-dialog

 <!--添加图书信息-->
    <el-dialog
      title="添加图书信息"
      :visible.sync="dialogFormVisible"
      width="500px"
    >
      <el-form
        :model="form"
        ref="addForm"
        label-position="right"
        :rules="rules"
      >
        <el-form-item
          label="书号"
          :label-width="formLableWidth"
          prop="bookISBN"
        >
          <el-input
            v-model="form.bookISBN"
            auto-complete="off"
            size="mini"
          ></el-input>
        </el-form-item>
        <el-form-item
          label="书名"
          :label-width="formLableWidth"
          prop="bookName"
        >
          <el-input
           type="textarea"
            v-model="form.bookName"
            auto-complete="off"
            size="mini"
          ></el-input>
        </el-form-item>
        <el-form-item label="作者" :label-width="formLableWidth">
          <el-input
            v-model="form.author"
            auto-complete="off"
            size="mini"
          ></el-input>
        </el-form-item>
        <el-form-item label="出版社" :label-width="formLableWidth">
          <el-input
            v-model="form.press"
            auto-complete="off"
            size="mini"
          ></el-input>
        </el-form-item>
        <el-form-item
          label="出版日期"
          :label-width="formLableWidth"
          prop="publicationdate"
        >
          <el-date-picker
            v-model="form.publicationdate"
            type="date"
            size="mini"
            placeholder="选择日期"
          >
          </el-date-picker>
        </el-form-item>
        <el-form-item label="价格" :label-width="formLableWidth">
          <el-input v-model="form.price" size="mini"></el-input>
        </el-form-item>
        <el-form-item label="数量" :label-width="formLableWidth">
          <el-input v-model.number="form.quantity" size="mini"></el-input>
        </el-form-item>
        <el-form-item label="图书类型" :label-width="formLableWidth">
          <el-select v-model="form.bookType" placeholder="请选择图书类型">
            <el-option
              v-for="item in bookTypeOptions"
              :key="item.type"
              :value="item.type"
              :label="item.name"
            ></el-option>
          </el-select>
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button @click="dialogFormVisible = false" size="mini"
          >取 消</el-button
        >
        <el-button type="primary" @click="addData('addForm')" size="mini"
          >确 定</el-button
        >
      </div>
    </el-dialog>

三、编写弹窗el-dialog中需要的data数据

 form: {
        bookISBN: "",
        bookName: "",
        author: "",
        press: "",
        price: "",
        publicationdate: "",
        bookType: "",
        quantity: "500",
      },
      dialogFormVisible: false,
      formLableWidth: "100px",

四、编写弹窗el-dialog中需要的prop检验规则

rules: {
          bookISBN: [
            {
              required: true,
              message: "请输入书号",
              trigger: "blur",
            }
          ],
          bookName: [
            {
              required: true,
              message: "请输入书名",
              trigger: "blur",
            }
          ],
          publicationdate: [
            {
              required: true,
              message: "请选择日期",
              trigger: ["blur", "change"],
            }
          ],
        },

五、编写弹窗el-dialog提交时校验判断

addData(formName){
        this.$refs[formName].validate((valid)=>{
            if(valid){
                alert(1)
            }else{
                alert(2)
            }
        })
    },

六、编写后台的新增接口 /addbookinfo

server-api/mocks/新增addbookinfo.js

/**
 * 信息新增接口
 *
 * @url addbookinfo
 *
 */
 
 module.exports = function (req) {
    return {
      code: 200,
      flag:true,
      message:"添加成功",
    }
 };

六、编写接口封装函数,src/api/bookinfo.js中增加一个新增方法

add(bookform){
    return myaxios({
        url:'/addbookinfo',
        method:'POST',
        data:bookform
   })
}

七、编写新增按钮提交逻辑,addData函数

 addData(formName){
        this.$refs[formName].validate((valid)=>{
            if(valid){
               bookinfoApi.add(this.form).then(response=>{
                   const resp = response.data
                   if(resp.flag){
                       this.fetchData()
                       this.dialogFormVisible = false
                   }else{
                      this.$message({
                         message:resp.message
                       })
                   }
               })
            }
        })
    }

image.png

八、解决日期提交后的乱码问题

image.png

value-format="yyyy-MM-dd HH:mm:ss"

 <el-form-item
          label="出版日期"
          :label-width="formLableWidth"
          prop="publicationdate"
        >
          <el-date-picker
            v-model="form.publicationdate"
             value-format="yyyy-MM-dd HH:mm:ss"
            type="date"
            size="mini"
            placeholder="选择日期"
          >
          </el-date-picker>
        </el-form-item>

九、提交后清空表单数据

data初始化时中先变为form:{}
 form: {
        // bookISBN: "",
        // bookName: "",
        // author: "",
        // press: "",
        // price: "",
        // publicationdate: "",
        // bookType: "",
        // quantity: "500",
      },
然后在表单提交的时候重新赋值form = {} 
   if(resp.flag){
       this.fetchData()
       this.dialogFormVisible = false;
       this.form = {}
   }
   
   
当然还有另一种方法,但是这种方法需要把每一个表单都配置一个prop
 if(resp.flag){
       this.fetchData()
       this.dialogFormVisible = false;
       this.$nextTick(()=>{
           this.$refs['addFoRm'].resetFields();
        })
   }

this.$nextTick的意思是等表单加载后进行重置