Vue3/pinia/父传子

1 篇文章 0 订阅

store 文件中定义了一个名为 useCounterStore 的函数,该函数使用 defineStore 函数来创建一个 store 对象。

useCounterStore 函数的参数是一个对象,包含以下属性:

  • state:用于定义 store 中的状态。在这个对象中,有一个名为 showGroupDetail 的属性,它是一个布尔值,表示当前组件是否显示组详细信息。
  • persist:用于指定 store 中的状态是否应该在组件挂载和卸载时保持不变。在这个对象中,persist 属性被设置为 {},表示所有状态都应该是持久的。
  • getters:用于定义 store 中的 getter 函数。在这个对象中,没有定义任何 getter 函数。
  • actions:用于定义 store 中的操作。在这个对象中,有一个名为 changeGroupDetail 的函数,该函数接受一个参数 val,并调用 this.showGroupDetail 设置为 val。
import {
    ref
} from 'vue'
import {
    defineStore
} from 'pinia';
export const useCounterStore = defineStore('counter',
    {
        state: () => {
            return {
                showGroupDetail: false, // 设置是否显示集团详情
            };
        },
        persist: {},
        getters: {},
        actions: {
            changeGroupDetail(val) {
                this.showGroupDetail = val; // 通过该方法来更改是否显示
            },
    }
})

父组件

<template>
  <div v-if="!showGroupDetail">
    <div class="box_outter">
      <div class="box_title flexBox">
        <div>
          <div class="box_title_icon"></div>
          <div class="box_title_text m-r-40">集团关系查询</div>
        </div>

        <div class="flexBox m-t-10">
          <div class="clickBtn flexBox" @click="goGroupShipConfirm">
            <el-icon><Collection /></el-icon>
            <p class="clickWord">发起认定</p>
          </div>

          <div class="clickBtn m-l-20 flexBox" @click="goGroupImport">
            <el-icon><DocumentAdd /></el-icon>
            <p class="clickWord">集团导入</p>
          </div>
        </div>
      </div>
      <div class="content_box">
        <div class="flex">
          <div class="w_25">
            <div class="screen-title">集团名称</div>
            <el-input
              class="searchInt"
              v-model="form.stockName"
              placeholder="请输入集团名称关键字"
            ></el-input>
          </div>
          <div class="w_25">
            <div class="screen-title">企业名称</div>
            <el-input
              class="searchInt"
              v-model="form.stockCode"
              placeholder="请输入企业名称关键字"
            ></el-input>
          </div>
          <div class="w_25">
            <div class="screen-title">所属机构</div>
            <el-select class="searchInt" v-model="form.market">
              <el-option
                v-for="item in institutionOptions"
                :key="item"
                :label="item.abbreviation"
                :value="item.sinfoExchmarket"
              />
            </el-select>
          </div>
        </div>
      </div>
      <div class="box_bottom">
        <el-button type="primary" @click="search">查询</el-button>
        <el-button class="refreshBtn" @click="refresh">重置</el-button>
      </div>
    </div>
    <div class="box_outter m-t-25">
      <div class="box_title">
        <div class="box_title_icon"></div>
        <div class="box_title_text m-r-40">查询结果</div>
        <el-button class="screen_top_btn" type="primary" @click="exportData"
          >导出数据</el-button
        >
      </div>
      <div class="content_box">
        <div class="tip_outter">
          <el-icon class="dis_inline" color="#de6427" size="20"><InfoFilled /></el-icon>
          <span class="dis_inline"> 共搜索到 {{ total }}个集团,{{ total }}个主体</span>
        </div>
        <el-table :data="tableData" class="normal-table" border style="width: 100%">
          <el-table-column align="center" type="selection"> </el-table-column>
          <el-table-column prop="sinfoWindcode" align="center" label="序号">
          </el-table-column>
          <el-table-column prop="binfoFullname" align="center" label="集团名称">
            <!-- <template #default="scope">
              <div class="text-c1 cus" @click="gotoDetails(scope.row)">
                {{ scope.row.binfoFullname }}
              </div>
            </template> -->
          </el-table-column>
          <el-table-column prop="sinfoName" align="center" label="企业名称" />
          <el-table-column prop="binfoIssuer" align="center" label="成员层级" />
          <el-table-column prop="sinfoExchmarket" align="center" label="所属机构" />
          <el-table-column prop="sinfoIndustryname2" align="center" label="发起人">
          </el-table-column>
          <el-table-column prop="binfoCreditrating" align="center" label="创建时间">
          </el-table-column>
          <el-table-column label="操作" width="" align="center">
            <template #default="scope">
              <el-col :span="20">
                  <el-link :underline="false"
                    @click="goGroupDetail(scope.row)" class="normal-link-n1 m-r-10">集团明细</el-link>
                </el-col>
            </template>
          </el-table-column>
        </el-table>
        <el-row class="m-t-15">
          <el-col :span="12" class="l-h-30"> </el-col>
          <el-col :span="12" class="t_right">
            <el-pagination
              @size-change="handleSizeChange"
              @current-change="handleCurrentChange"
              :current-page="currentPage"
              :page-sizes="[10, 20, 50]"
              :page-size="pageSize"
              layout=" prev, pager, next, sizes,jumper"
              :total="total"
            >
            </el-pagination>
          </el-col>
        </el-row>
      </div>
    </div>
  </div>

// 在子组件上绑定上父组件要传给他的值
  <div v-if="showGroupDetail">
    <groupDetail :groupInfo="groupInfo" />
  </div>
</template>


<script setup>
import { useCounterStore } from "@/stores/counter"; // 引入了useCounterStore函数,用于创建一个计数器存储器
const store = useCounterStore(); 
import { storeToRefs } from "pinia"; // 从pinia库中导入storeToRefs函数,该函数用于将存储器转换为可访问的属性
const { showGroupDetail } = storeToRefs(store); // 引入Store中的showGroupDetail属性 并赋值给上述模板中用来控制显示隐藏
const groupDetail = defineAsyncComponent(() => import("../../components/groupRelationship/groupDetail.vue"));  在父组件中引入子组件

const groupInfo = ref({}) // 集团详情信息(父组件要传递给组件的内容)
const goGroupDetail = (e) => {
  store.changeGroupDetail(true) // 更改Store中状态的值(用于解锁显示子组件)
  groupInfo.value = e // 将点击事件的值全部赋值给要传递给子组件的值
};


<script>

子组件

<template>
  <div class="box_outter">
    <div class="box_title flexBox">
      <div class="flexBox">
        <div>
          <div class="box_title_icon"></div>
          <!-- 回显父组件传过来的内容 -->
          <div class="box_title_text m-r-40">{{ mainInfo.groupInfo.binfoFullname }}</div>
        </div>
        <div class="childrenGroup">下辖子公司明细</div>
        <div class="clickBtn m-l-20" @click="backGroupQuery">
          <el-icon><Back /></el-icon>
          返回
        </div>
      </div>
    </div>
  </div>
  </div>
</template>

<script setup>
import { useCounterStore } from "@/stores/counter";
const store = useCounterStore();
import { storeToRefs } from "pinia";
const { showGroupDetail } = storeToRefs(store);
const backGroupQuery = () => {
  store.changeGroupDetail(false) // 修改Store的值(让其回显父组件)
};

// 用来接收父组件传过来的内容
const mainInfo = defineProps({
    groupInfo: {
        type: String,
    }
})
</script>

<style scoped>
.searchInt {
  width: calc(100% - 110px);
}
.tip_outter {
  padding: 10px 20px;
  background-color: #e6f3fc;
  border-radius: 5px;
  margin-bottom: 20px;
}

.flexBox {
  display: flex;
  justify-content: space-between;
}

.clickBtn {
  color: #de6427;
  font-size: 16px;
  margin-left: 3px;
  cursor: pointer;
}

.m-l-20 {
  margin-left: 20px;
}

.clickWord {
  margin-top: -3px;
  margin-left: 3px;
}

.childrenGroup{
  font-size: 14px;
  margin-top: 20px;
  margin-right: 20px;
}
</style>

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值