Vue3: как получить доступ к переменным в <script setup> из экспорта по умолчанию

Когда я делаю миграцию проекта с vue2 на vue3, в сегменте настройки сценария vue3 есть переменная, но мне нужно получить к ней доступ в методе в части экспорта по умолчанию, которая относится к проекту vue2. Если я получу к нему доступ напрямую, он выдаст ошибку, которая означает «не определено» или «не определено».

<template>
  <button @click = "btnClick">{{layout}}</button>           //{{layout}} works fine
</template>

<script setup>
  import { ref } from 'vue'
  const layout = ref("someting")
  defineOptions({
    name: 'App'
  });
</script>

<script>
  export default {
    name: 'MyApp',
    methods: {
      btnClick: function(e){
        console.info(layout)             //an error will be thrown
      }
    }
  }
</script>

Подробная информация об ошибке приведена ниже:

Uncaught ReferenceError: layout is not defined
    btnClick App.vue:19
    0 App.vue:2
    callWithErrorHandling runtime-core.esm-bundler.js:195
    callWithAsyncErrorHandling runtime-core.esm-bundler.js:202
    invoker runtime-dom.esm-bundler.js:693
    addEventListener runtime-dom.esm-bundler.js:644
    patchEvent runtime-dom.esm-bundler.js:662
    patchProp runtime-dom.esm-bundler.js:739
    mountElement runtime-core.esm-bundler.js:4641
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
52
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Если вы хотите получить к нему доступ в методе в части экспорта по умолчанию, объявите переменную в setup().

<template>
  <button @click = "btnClick">{{ layout }}</button>
</template>

<script>
import { ref } from 'vue';

export default {
  name: 'MyApp',
  setup() {
    const layout = ref('something');

    const btnClick = () => {
      console.info(layout.value);
    };

    // return variables and methods to make them available on the component instance
    return {
      layout,
      btnClick
    };
  }
};
</script>

vue3 Composition API: setup() Документ https://vuejs.org/api/composition-api-setup.html

привет, у меня слишком много методов, таких как событие щелчка, в файле слишком большого количества компонентов из проекта vue2. Должен ли я удалить сегмент методов и переместить их в setup()? Это потребует от нас огромной работы. Казалось, что я не могу сохранить событие щелчка кнопки мыши в части метода, если хочу получить доступ к переменной «макет». Спасибо

Bes Ley 24.07.2024 04:19

Если вам сложно удалить функцию из части методов, вы можете поместить переменную внутри data(){} и получить к ней доступ в методе с помощью this. <script> export default { name: 'MyApp', data() { return { layout: 'something' }; }, methods: { btnClick: function (e) { console.info(this.layout); } } }; </script>

woo.y 24.07.2024 06:42
Ответ принят как подходящий

Если вы хотите использовать vue2 и vue3 вместе, вам следует создать только один скрипт и переместить содержимое настройки скрипта в функцию настройки.

<template>
  <button @click = "btnClick">{{layout}}</button>           
</template>
<script>
  import { ref } from 'vue'
  export default {
    setup() {
      const layout = ref("someting")
      return {
        layout
      }
    },
    name: 'MyApp',
    methods: {
      btnClick: function(e) {
        console.info(this.layout)
      }
    }
  }
</script>

Это работает, <script setup> следует полностью переместить в setup() в настройках экспорта по умолчанию, иначе это создаст много проблем. Vue3 — это действительно новая возможность, когда возникает задача миграции из vue2. Спасибо

Bes Ley 24.07.2024 12:02

если вы хотите перейти с vue2 на vue3, вы можете написать это в настройке скрипта

<template>
  <button @click = "btnClick">{{layout}}</button>          
</template>

<script setup>
  import { ref } from 'vue'
  const layout = ref("someting")
  function btnClick(){
    console.info(layout.value);
  }
</script>

Другие вопросы по теме