Есть два основных способа:
Назначить значение переменной внутри файла, но вне определения компонента. Итак, в вашем примере вы сказали бы let info;
, а в своем created()
хук вы бы пошли this.info = info = await appService.getPosts()
.
Назначьте сам компонент для переменной перед ее экспортом:
const myComponent = { component definition... }
// Access with myComponent.info
export default myComponent;
Однако! Вы увидите, что myComponent.info
изначально undefined
. И в отличие от шаблона, значение info
не будет реактивно обновляться при разрешении асинхронного вызова. Магия реактивности работает только в шаблоне и в коде фактического компонента, например в computed
и watch
свойствах. То, как элегантно обрабатывать особенности асинхронной загрузки, действительно зависит от того, как вы хотите использовать эту переменную.
И наконец: причина, по которой вы не просто получаете доступ к переменной в файле .vue, заключается в том, что под капотом шаблон компилируется в функцию, которая выполняется в контексте компонента. Для удобства все поля компонента затем становятся доступными в виде переменных без обычного префикса this
. Фактически, в вашем шаблоне info
рассматривается как сокращение для this.info
. (Обратите внимание, что вы можете заменить this.info
на info
в шаблоне, и он все равно будет работать.) Эта привилегия не применяется к любому другому коду в файле; это просто ванильный код JS.
Нет. Конструкторы копирования должны иметь ссылку, а не указатель, если это будет полезно для передачи по значению и т. Д.
Да, вы можете написать конструктор, который принимает указатель на объект. Однако его нельзя назвать конструктором копирования. Само определение конструктора копирования требует, чтобы вы передавали объект того же класса. Если вы передаете что-то еще, да, это нормально конструктор, но не конструктор копирования.
Вы можете написать конструктор, который принимает указатель в качестве аргумента.
Но конструктор копирования - это имя, которое мы даем конкретному конструктору.
Конструктор, который принимает ссылку (предпочтительно const, но не обязательно) того же класса, что и аргумент, просто называется конструктором копирования, потому что это то, что он делает эффективно.
Кроме того факта, что это не будет конструктор копирования, и компилятор сгенерирует конструктор копирования, если вы явно не отключите его Нечего получить и многое потерять. Какова правильная семантика для конструктора из нулевого указателя? Что это добавляет к пользователю вашего класса? (Подсказка: ничего, если она хочет создать объект из кучи, она может просто разыменовать указатель и использовать обычный конструктор копирования).
По определению, копирующий ctor использует константную ссылку. Хотя ничто не мешает вам написать ctor, который принимает указатель, он вызывает некоторые проблемы, которые отсутствуют при использовании ссылки - например, что должно / может произойти, если передан нулевой указатель?
Конструктор копирования нуждается в ссылке, поскольку параметр значения потребует создания копии, которая вызовет конструктор копирования, который создаст копию своего параметра, который вызовет конструктор копирования, который ...
Вы можете написать такой конструктор, но технически это не конструктор копирования. Например, контейнеры STL будут по-прежнему использовать сгенерированный компилятором конструктор копирования (компилятор генерирует его, потому что вы его не написали).
Конструктор копирования неявно используется в двух случаях:
Как уже упоминали другие, вы можете написать конструктор с описанной сигнатурой (или с указателем const), но это не будет используется в любом из вышеперечисленных случаев.