Wenn die Komponente geladen wird, sind Provide und Inject von Vue undefiniert.
P粉377412096
2023-08-26 09:34:12
<p><br /></p><h2>Situation</h2>
<p>Ich versuche, die Options-API von Vue zum Bereitstellen und Einfügen von Funktionen zu verwenden, damit die Komponente <code>header.vue</code> Daten für den <code>container-nav.vue</code> bereitstellen kann ; Komponente (siehe Komponentenhierarchie). Wenn Daten jedoch injiziert werden, sind sie beim ersten Laden undefiniert. </p>
<p><strong>Aktuelle Komponentenhierarchie: </strong></p>
<ul>
<li>header.vue > header-nav-menu.vue >container-nav.vue</li>
</ul>
<h1>Versuch 1 – header.vue (Großvater)</h1>
<p>In dieser Komponente erhalte ich die folgende Zeichenfolge <code>'/'</code> in <code>Provide() {}</code> </p>
<pre class="brush:php;toolbar:false;">import { defineComponent } from 'vue'
parentStore aus '@/store' importieren
Standard exportieren defineComponent({
aufstellen() {
// Sollte keinen Zugriff auf this.navHome haben -> undefiniert (wird vor der Options-API geladen)
console.log("1. Setup im Header aufrufen")
const storeCommon = parentStore()
return { storeCommon }
},
beforeCreate() {
// Sollte keinen Zugriff auf this.navHome haben -> undefiniert (wird vor der Options-API geladen)
console.log("2. Aufruf von beforeCreate im Header")
},
bieten() {
console.log("3. Provide im Header aufrufen")
zurückkehren {
navHome: this.storeCommon.textualData[0]?.navigation.links.home
}
},
erstellt() {
// Sollte Zugriff auf this.navHome haben -> '/' (wird nach der Options-API geladen)
console.log("9. Aufruf von beforeCreate in Container Nav: ", this.$refs.navHome)
},
mount() {
// Sollte Zugriff auf this.navHome haben -> '/' (wird nach der Options-API geladen)
console.log("8. Aufruf von beforeCreate in Container Nav: ", this.$refs.navHome)
}
})</pre>
<h1>Versuchen Sie 1 – container-nav.vue (untergeordnet)</h1>
<p>In diese Komponente füge ich den <code>navHome</code> ein, der von der Komponente <code>header.vue</code> bereitgestellt wird.</p>
<pre class="brush:php;toolbar:false;">import { defineComponent } from 'vue'
Standard exportieren defineComponent({
injizieren: [ 'navHome' ],
aufstellen() {
// Sollte keinen Zugriff auf this.navHome haben -> undefiniert (wird vor der Options-API geladen)
console.log("4. Setup in Container Nav aufrufen")
},
beforeCreate() {
// Sollte keinen Zugriff auf this.navHome haben -> undefiniert (wird vor der Options-API geladen)
console.log("5. Aufruf von beforeCreate in Container Nav")
},
erstellt() {
// Sollte Zugriff auf this.navHome haben -> '/' (wird nach der Options-API geladen)
console.log("6. Aufruf von beforeCreate in Container Nav: ", this.$refs.navHome)
},
mount() {
// Sollte Zugriff auf this.navHome haben -> '/' (wird nach der Options-API geladen)
console.log("7. Aufruf von beforeCreate in Container Nav: ", this.$refs.navHome)
}
})</pre>
<h1>尝试 1 - 测试</h1>
<p>使用 console.logs 运行以下代码会产生以下结果:</p>
<pre class="brush:php;toolbar:false;">1. Aufruf des Setups im Header
2. Aufruf von beforeCreate im Header: undefiniert -> Richtig
3. Aufruf von Provide im Header
4. Setup im Container Nav aufrufen
5. Aufruf von beforeCreate im Container Nav: undefiniert -> Richtig
6. Aufruf in Container Nav erstellt: undefiniert -> Falsch (sollte „/“ sein)
7. Aufruf im Container Nav: undefiniert -> Falsch (sollte „/“ sein)
8. Aufruf im Header eingefügt: undefiniert -> Falsch (sollte „/“ sein)
9. Aufruf im Header erstellt: undefiniert -> Falsch (sollte „/“ sein)</pre>
<hr />
<h1>尝试 2 - header.vue(祖父母)</h1>
<p>使用与之前相同的代码和选项 API, 除了使用 <code>setup</code> und <code>provide</code>.</p>
<pre class="brush:php;toolbar:false;">import { defineComponent, Provide } from 'vue'
parentStore aus '@/store' importieren
aufstellen() {
// 1. Habe es auf diese Weise versucht
const navLinkHome = parentStore().getTextualData[0]?.navigation.links.home
const navHome = Provide('navHome', navLinkHome)
// 2. Habe es auf diese Weise versucht
const navHome = Provide('navHome', parentStore().getTextualData[0]?.navigation.links.home)
zurückkehren {
// 1 & 2
navHome
// Und auch hier entlang
navHome: Provide('navHome', parentStore().getTextualData[0]?.navigation.links.home)
}
}</pre>
<h1>尝试 2 – container-nav.vue(子级)</h1>
<pre class="brush:php;toolbar:false;">import { defineComponent, inject } from 'vue'
aufstellen() {
const navHome = inject('navHome')
zurückkehren {
navHome
// Habe das auch versucht, aber dasselbe wie oben, nur länger
navHome: navHome
}
}</pre>
<h1>尝试 2 - 测试</h1>
<p>使用 console.logs 运行以下代码会产生以下结果:</p>
<pre class="brush:php;toolbar:false;">1. Aufruf des Setups im Header
2. Aufruf von beforeCreate im Header: undefiniert -> Richtig
3. Setup im Container Nav aufrufen
4. Aufruf von beforeCreate in Container Nav: undefiniert -> Richtig
5. Aufruf im Container Nav erstellt: undefiniert -> Falsch (sollte „/“ sein)
6. Aufruf im Container Nav: undefiniert -> Falsch (sollte „/“ sein)
7. Aufruf im Header eingefügt: undefiniert -> Falsch (sollte „/“ sein)
8. Aufruf im Header erstellt: undefiniert -> Falsch (sollte „/“ sein)</pre>
<h2>混乱</h2>
<ul>
<li><p>首先,我注意到在 <code>header.vue</code> 中使用 <code>provide() {}</code> Optionen-API 时,并尝试引用 <code>navHome</code> 。Sie können dies auch tun: <code>CreateComponentPublicInstance</code> 类型上不存在.为了解决这个问题,我改为使用 <code>this.$refs.navHome</code> - 甚至不确定这是否是正确的做法.</p>
</li>
<li><p>其次,当在 <code>container-nav.vue</code> 组件中使用 <code>inject: [ 'navHome' ]</code> 时,我无法使用 <code>this.navHome</code> 访问它.Auch hier kann ich nur mit <code>this.$refs.navHome</code> darauf zugreifen. </p>
</li>
</ul>
<p>Aber. </p>
<ul>
<li>Bei Verwendung von Provide in der Setup-Methode von <code>header.vue</code> und Inject in der Setup-Methode von <code>container-nav.vue</code> kann ich <code> verwenden ;this.navHome</code> greift auf <code>navHome</code> zu. Ich bin mir nicht sicher, warum das so ist. </li>
</ul><p><br /></p>
parentStore().getTextualData[0]?.navigation.links.home
在父级提供时具有值"/"
因为它不是一个响应式对象this.$refs.navHome
是错误的方式,this.navHome
应该可以工作。不过,我建议您使用组合 API 样式