Vue 3 组合 API,如何在 setup() 函数中获取上下文父 属性?
Vue 3 composition API, how to get context parent property in the setup() function?
我 运行 遇到了 Vue 3 (alpha 4) 的问题:
在 setup()
函数中,我正在尝试读取父组件。根据 https://vue-composition-api-rfc.netlify.com/api.html#setup 上的文档,它应该通过 context
参数公开父级,作为 context.attrs 的 属性 或直接作为父级(参见 SetupContext
位在 'typing' 下)。我发现有关 parent
是否应该直接从 SetupContext
或通过 SetupContext.attrs
访问的文档不是很清楚,所以我尝试了两种方法,但无济于事。
这是我的问题,我可以在记录它们时很好地访问 SetupContext
和 SetupContext.attrs
(这是一个代理)。 SetupContext.attrs
公开了通常的代理属性([[Handler]]
、[[Target]]
和 [[IsRevoked]]
)并且在检查 [[Target]]
时它清楚地显示了父级 property。
虽然记录父级时,它只是打印出未定义的:
export default {
setup(props, context) {
console.log(context);
// Output: {attrs: Proxy, slots: Proxy, emit: ƒ}
console.log(context.attrs);
// Output: Proxy {vnode: {…}, parent: {…}, appContext: {…}, type: {…}, root: {…}, …}
console.log(context.attrs.parent);
// Output: undefined
}
};
传播上下文产生相同的结果:
export default {
setup(props, { attrs, parent }) {
console.log(attrs);
// Output: Proxy {vnode: {…}, parent: {…}, appContext: {…}, type: {…}, root: {…}, …}
console.log(attrs.parent);
// Output: undefined
console.log(parent);
// Output: undefined
}
};
我对 JavaScript 中的代理有点陌生,但从我读到的内容来看,以及通过对 reactive() 返回的代理进行实验,例如。我应该能够像通常访问对象一样访问 属性 。关于我做错了什么的想法?
我创建了一个 codesandbox 来重现问题
我知道这并没有直接回答问题,但是使用 provide/inject (https://v3.vuejs.org/guide/component-provide-inject.html) 帮助我解决了同样的问题,我想从父节点获取数据属性并且将其传递给呈现的组件,但在从 Vue2 升级到 Vue3 后无法再访问父组件。我没有尝试公开父级,而是将其数据集中的道具向下传递给呈现的组件。
创建应用程序后,我执行了以下操作。
main.js
import { createApp } from "vue";
import MyComponent from './components/MyComponent.vue';
const section = document.getElementById('some-element'); // this element contains a data-attribute which I need to use within the app. In my case, I can't get the data from the component created/mounted function as the section with the data attribute is loaded onto the page multiple times with different attributes each time.
const app = createApp(MyComponent);
app.provide('dataset', section.dataset.id); // section.dataset.id contains some kind of id, let's say 'abc123' for the sake of this example
app.use(store); //not relevant for this answer
app.mount(section);
然后,在组件内部,我可以通过执行以下操作来访问 'dataset'。
MyComponent.vue
<template>
<div>Normal template stuff here</div>
</template>
<script>
export default {
name: 'MyComponent',
inject: ['dataset'], // the magic
created() {
console.log(this.dataset); // will log 'abc123'
}
}
</script>
这非常精简,但我想很好地展示了我的情况。无论如何,如果你想做类似的事情并想通过父数据属性获取数据,你可以查看 provide/inject.
希望对大家有所帮助!
您可以使用 getCurrentInstance
。 Vue documentation.
就这么简单:
import { getCurrentInstance } from "vue";
export default {
setup(props) {
const instance = getCurrentInstance();
console.log("parent");
console.log(instance.parent);
}
}
此外,可能值得注意的是 Vue composition api plugin 以相同的方式公开父级,但它在那里被引用为 instance.$parent
。
我 运行 遇到了 Vue 3 (alpha 4) 的问题:
在 setup()
函数中,我正在尝试读取父组件。根据 https://vue-composition-api-rfc.netlify.com/api.html#setup 上的文档,它应该通过 context
参数公开父级,作为 context.attrs 的 属性 或直接作为父级(参见 SetupContext
位在 'typing' 下)。我发现有关 parent
是否应该直接从 SetupContext
或通过 SetupContext.attrs
访问的文档不是很清楚,所以我尝试了两种方法,但无济于事。
这是我的问题,我可以在记录它们时很好地访问 SetupContext
和 SetupContext.attrs
(这是一个代理)。 SetupContext.attrs
公开了通常的代理属性([[Handler]]
、[[Target]]
和 [[IsRevoked]]
)并且在检查 [[Target]]
时它清楚地显示了父级 property。
虽然记录父级时,它只是打印出未定义的:
export default {
setup(props, context) {
console.log(context);
// Output: {attrs: Proxy, slots: Proxy, emit: ƒ}
console.log(context.attrs);
// Output: Proxy {vnode: {…}, parent: {…}, appContext: {…}, type: {…}, root: {…}, …}
console.log(context.attrs.parent);
// Output: undefined
}
};
传播上下文产生相同的结果:
export default {
setup(props, { attrs, parent }) {
console.log(attrs);
// Output: Proxy {vnode: {…}, parent: {…}, appContext: {…}, type: {…}, root: {…}, …}
console.log(attrs.parent);
// Output: undefined
console.log(parent);
// Output: undefined
}
};
我对 JavaScript 中的代理有点陌生,但从我读到的内容来看,以及通过对 reactive() 返回的代理进行实验,例如。我应该能够像通常访问对象一样访问 属性 。关于我做错了什么的想法?
我创建了一个 codesandbox 来重现问题
我知道这并没有直接回答问题,但是使用 provide/inject (https://v3.vuejs.org/guide/component-provide-inject.html) 帮助我解决了同样的问题,我想从父节点获取数据属性并且将其传递给呈现的组件,但在从 Vue2 升级到 Vue3 后无法再访问父组件。我没有尝试公开父级,而是将其数据集中的道具向下传递给呈现的组件。
创建应用程序后,我执行了以下操作。
main.js
import { createApp } from "vue";
import MyComponent from './components/MyComponent.vue';
const section = document.getElementById('some-element'); // this element contains a data-attribute which I need to use within the app. In my case, I can't get the data from the component created/mounted function as the section with the data attribute is loaded onto the page multiple times with different attributes each time.
const app = createApp(MyComponent);
app.provide('dataset', section.dataset.id); // section.dataset.id contains some kind of id, let's say 'abc123' for the sake of this example
app.use(store); //not relevant for this answer
app.mount(section);
然后,在组件内部,我可以通过执行以下操作来访问 'dataset'。
MyComponent.vue
<template>
<div>Normal template stuff here</div>
</template>
<script>
export default {
name: 'MyComponent',
inject: ['dataset'], // the magic
created() {
console.log(this.dataset); // will log 'abc123'
}
}
</script>
这非常精简,但我想很好地展示了我的情况。无论如何,如果你想做类似的事情并想通过父数据属性获取数据,你可以查看 provide/inject.
希望对大家有所帮助!
您可以使用 getCurrentInstance
。 Vue documentation.
就这么简单:
import { getCurrentInstance } from "vue";
export default {
setup(props) {
const instance = getCurrentInstance();
console.log("parent");
console.log(instance.parent);
}
}
此外,可能值得注意的是 Vue composition api plugin 以相同的方式公开父级,但它在那里被引用为 instance.$parent
。