VUE学习笔记(七)-依赖注入provide和inject

依赖注入provide和inject

Category.vue

<template>
    <el-card class="box-card">
        <template #header>
            <div class="card-header">
                <span>商品分类</span>
                <el-button type="primary" icon="CirclePlus" round @click="handleDialog()">添加分类</el-button>
            </div>
        </template>
        <el-table :data="tableData.list" stripe style="width: 100%">
            <el-table-column prop="id" label="Id" width="180" />
            <el-table-column prop="name" label="名称" width="180" />
            <el-table-column fixed="right" label="操作" width="180">
                <template #default="scope">
                    <el-button type="success" size="small" @click="handleDialog(scope.row)">
                        修改
                    </el-button>
                    <el-button type="danger" size="small" @click="open(scope.row.id)">删除</el-button>
                </template>
            </el-table-column>
        </el-table>

    </el-card>
    <AddCategoryVue ref="addCategoryRef" :dialogTitle="dialogTitle" :tableRow="tableRow"></AddCategoryVue>
</template>

<script setup>

import { onMounted, reactive, ref,provide } from 'vue'
import axios from "@/api/api_config.js"
import { ElMessage, ElMessageBox } from 'element-plus'
import AddCategoryVue from '@/components/AddCategory.vue'
import { isNull } from '@/utils/filter.js'

///----------------------------------
const tableData = reactive({ list: [] })
const addCategoryRef = ref(null)//获取子组件实例
const dialogTitle = ref("")//对话框标题
const tableRow = ref({})
///----------------------------------

onMounted(() => {
    getList()
})

//获取分类信息
const getList = () => {
    return axios.get('/category').then((res) => {
        tableData.list = res.data
    })
}

provide("getList",getList)

//打开分类页
const handleDialog = (row) => {
    if (isNull(row)) {
        dialogTitle.value = "添加分类"
    } else {
        dialogTitle.value = "修改分类"
        tableRow.value = row
    }

    addCategoryRef.value.dialogCategory()//调用子组件方法

}

const open = (id) => {
    ElMessageBox.confirm(
        '确定要删除吗?',
        '信息提示',
        {
            confirmButtonText: '确定',
            cancelButtonText: '取消',
            type: 'warning',
        }
    )
        .then(() => {
            console.log(id)
            axios.delete(`/Category/${id}`).then(() => {
                ElMessage({
                    type: 'success',
                    message: '删除成功',
                });
                //重新加载数据
                getList();
            })

        })
        .catch(() => {
            ElMessage({
                type: 'info',
                message: '取消删除',
            })
        })
}

</script>

 

 

 

AddCategory.vue

<template>

    <el-dialog v-model="dialogVisible" :title="dialogTitle" width="500" :before-close="handleClose">
        <el-form :model="ruleFroms" label-width="auto" style="max-width: 600px">
            <el-form-item label="分类名称" prop="name">
                <el-input v-model="ruleFroms.name" />
            </el-form-item>
        </el-form>
        <template #footer>
            <div class="dialog-footer">
                <el-button @click="dialogVisible = false">取消</el-button>
                <el-button type="primary" @click="addCategory">
                    提交
                </el-button>
            </div>
        </template>
    </el-dialog>
</template>

<script setup>
import axios from '@/api/api_config';
import { reactive, toRefs, watch,inject } from 'vue'
import { ElMessage } from 'element-plus';
///----------------------------------

const props = defineProps({
    dialogTitle: {
        type: String,
        default: 'AddCategory'
    },
    tableRow: {
        type: Object
    }
})
const reload=inject("getList")

const state = reactive({
    dialogVisible: false,
    ruleFroms: {
        id: '',
        name: ''
    },
})
//监听器
watch(
    //需要监控的数据
    () => props.tableRow,
    //检测到变化后需要做的事情
    () => {
        state.ruleFroms = props.tableRow;
    },
    //配置
    { deep: true, immediate: true }
)
///----------------------------------
//打开对话框
const dialogCategory = () => {
    state.dialogVisible = true;

}
//提交修改或者添加
const addCategory = () => {
    if (props.dialogTitle == "添加分类") {
        let param = {
            name: ruleFroms.value.name
        }
        axios.post('/category', param).then(() => {
            state.dialogVisible = false
            ElMessage.success('添加成功')

            reload()
        })
    } else {
        console.log("id", props.tableRow.id)
        console.log("name", ruleFroms.value.name)

        let param = {
            id: props.tableRow.id,
            name: ruleFroms.value.name
        }
        axios.put('/category', param).then(() => {
            state.dialogVisible = false
            ElMessage.success('修改成功')
            reload()
        })
    }
}


//解构
const { dialogVisible, ruleFroms } = toRefs(state)


//主动暴露给父组件,编译器的宏命令,不需要引入
defineExpose({
    dialogCategory
})

</script>

 

posted on 2024-05-29 10:09  御行所  阅读(2)  评论(0编辑  收藏  举报

导航