feat: computed使用provide下发数据,响应式数据问题

master
lichaojun 8 months ago
parent 158ab8a311
commit 7927050c34

@ -0,0 +1,33 @@
<template>
<div>Demo 更改Table显示</div>
</template>
<script>
export default {
name: 'index',
inject: ['currentComponent', 'refresh'],
data() {
return {};
},
mounted() {
this.hasPermission();
},
methods: {
hasPermission() {
let allComponents = this.currentComponent();
allComponents.forEach((item) => {
if (item.name === 'Table') {
item.hidden = false;
}
});
console.log(allComponents);
/**
* 第一种方法直接调用refresh方法刷新页面
*/
// this.refresh();
},
},
};
</script>
<style lang="less" scoped></style>

@ -0,0 +1,23 @@
export const allComponents = [
{
name: 'Button',
icon: 'el-icon-s-tools'
},
{
name: 'Input',
icon: 'el-icon-s-tools'
},
{
name: 'Table',
icon: 'el-icon-s-tools',
hidden: true
},
{
name: 'Form',
icon: 'el-icon-s-tools'
},
{
name: 'Select',
icon: 'el-icon-s-tools'
}
];

@ -0,0 +1,50 @@
<template>
<main>
<div
v-for="component in currentComponent"
:key="component.name"
v-show="!component.hidden"
>
<div>{{ component.name }}</div>
</div>
<ChildDemo />
<button @click="refresh"></button>
</main>
</template>
<script>
import ChildDemo from './components/child.vue';
import { allComponents } from './config/index';
export default {
components: { ChildDemo },
data() {
return {
//
cpt: allComponents,
};
},
provide() {
return {
currentComponent: () => this.currentComponent,
refresh: this.refresh,
};
},
computed: {
currentComponent() {
/**
* 第二种方法通过将数据放在data中, 形成数据响应式
* 然后在computed中返回数据这样在provide下发给子组件时子组件直接修改数据也可以看到修改
*/
// return allComponents; //
return this.cpt; //
},
},
methods: {
refresh() {
this.$forceUpdate();
},
},
};
</script>
Loading…
Cancel
Save