Heim  >  Fragen und Antworten  >  Hauptteil

Wenn die Komponente geladen wird, sind Provide und Inject von Vue undefiniert.

<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>
P粉377412096P粉377412096419 Tage vor452

Antworte allen(1)Ich werde antworten

  • P粉121447292

    P粉1214472922023-08-27 00:28:25

    • 您需要确保 parentStore().getTextualData[0]?.navigation.links.home 在父级提供时具有值 "/"因为它不是一个响应式对象
    • 或者您可以提供这样的响应式对象:
    const navLinkHome = computed(()=> parentStore().getTextualData[0]?.navigation.links.home)
    const navHome = provide('navHome', navLinkHome)
    
    • this.$refs.navHome 是错误的方式,this.navHome 应该可以工作。不过,我建议您使用组合 API 样式
    • 我很好奇,您已经有了 pinia 商店,为什么还需要使用提供/注入?

    Antwort
    0
  • StornierenAntwort