первоначальное намерение
Я написал статью раньше, оVue
Прозрачная передача атрибутов. В статье я перечислил множество способов достижения прозрачной передачи атрибутов. который включает в себя прямые настройкиprops
,v-bind="$attrs"
,render function
и так далее. интересно, см. подробности[Vue Advanced] — Как добиться прозрачной передачи атрибутов компонентов?
Но потом землекоп оставил мне сообщение, на самом делеv-bind="obj"
Вы можете напрямую пройти все свойства расширенного объекта, попробуйте, это возможно
Это заставило меня понять, что яVue
Недостаточное владение навыками, все с этой статьи.В этой статье я резюмирую многие вещи, которые могут помочь нам повысить эффективность разработки.Vue
методы, а также указать сценарии использования и меры предосторожности для этих методов, я твердо уверен, чтоVue
У разработчиков есть помощь
1. Прозрачная передача атрибутов через v-bind="$props" и v-bind="$attrs"
Много раз мы будем писать некоторые вложенные компоненты, например, подкомпонентом A является B, а подкомпонентом B является C. В это время, если А проходитprops
к B, и B должен пройтиprops
в C, мы часто пишем это, когда B передается в C
<template>
<child-component :someprop1="someprop1"
:someprop2="someprop2"
:someprop3="someprop3"
:someprop4="someprop4"
...
/>
</template>
Это очень неэлегантно, на самом деле вы можете напрямую использоватьv-bind: $props
<template>
<child-component v-bind="$props"/>
</template>
Здесь мы используемv-bind
Весь объект может быть передан вproperty
,аналогичныйv-bind="Obj"
. Например, для данного поста объекта
post: {
id: 1,
title: 'My Journey with Vue'
}
Шаблон ниже:
<blog-post v-bind="post"></blog-post>
Эквивалентно:
<blog-post
v-bind:id="post.id"
v-bind:title="post.title"
></blog-post>
это подходитv-bind="$attrs"
Это очень полезно при инкапсуляции некоторых компонентов, таких как реализация прозрачной передачи свойств.
vm.$attrs
содержит бездействие в родительской областиprop
признанный (и приобретенный)attribute
Привязки (кроме класса и стиля). Когда компонент не объявляет никаких реквизитов, сюда включаются все привязки родительской области (кроме класса и стиля), и к ним можно получить доступ черезv-bind="$attrs"
Передача внутренних компонентов — полезно при создании высокоуровневых компонентов.
Например, пройдя в приведенном вышеprops
все связаны сel-input
, мы можем написать это в дочернем компоненте:
<template>
<div>
<el-input v-bind="$attrs" ></el-input>
</div>
</template>
Подробности можно увидеть[Vue Advanced] — Как добиться прозрачной передачи атрибутов компонентов?
Некоторые студенты могли подумать
provide
а такжеinject
, действительно можно передатьprops
, но не может сделать атрибут прозрачной передачи, иprovide
а такжеinject
Привязки не реактивны, что требует дополнительного внимания. Это сделано намеренно. Однако, если вы передаете прослушиваемый объект, свойства объекта по-прежнему реагируют.
2. Оба компонента принимают одни и те же реквизиты
В приведенном выше примере компоненты B и C должны принимать одинаковыеprops
, где компонент B записывается следующим образом (компонент C аналогичен):
<template>
<child-component v-bind="$props"/>
</template>
<script>
import ChildComponent from '@/components/ChildComponent'
export default {
props:{
someProp1: String,
someProp2: String,
someProp3: String,
// and so on
}
}
</script>
Но с этим есть проблема, то есть модифицируется компонент Cprops
, тогда компонент B должен быть изменен вместе, недостатком этого может быть упущение. Кроме того, код избыточен и не кажется оптимизированным. На самом деле, мы можем записать это в компоненте B
<template>
<child-component v-bind="$props"/>
</template>
<script>
import ChildComponent from '@/components/ChildComponent'
export default {
props:{
...ChildComponent.options.props
}
}
</script>
3. Проверка реквизита
из-заJavascript
слабо типизированный язык, написаниеprops
когда лучше всегоprops
использоватьtype
Укажите тип и установите значение по умолчанию следующим образом:
Vue.component('my-component', {
// 带有默认值的对象
propA: {
type: Object,
// 对象或数组默认值必须从一个工厂函数获取
default: function () {
return { message: 'hello' }
}
}
})
Но чего мы можем не знать, так это того, чтоprops
Настраиваемые функции проверки
Vue.component('my-component', {
// 自定义验证函数
propF: {
validator: function (value) {
// 这个值必须匹配下列字符串中的一个
return ['success', 'warning', 'danger'].indexOf(value) !== -1
}
}
})
даже вышеtype
кроме того, что вы можете установитьString
Number
Boolean
Array
Object
Date
Function
Symbol
Кроме того, вы также можете настроить конструктор, и его основной принцип реализации заключается вinstanceof
судить
function Person (firstName, lastName) {
this.firstName = firstName
this.lastName = lastName
}
Vue.component('blog-post', {
props: {
author: Person
}
})
Это для проверкиauthor prop
Передается ли значениеnew Person
созданный
4. Прозрачная передача всех прослушивателей событий
Иногда нам нужны компоненты формы для некоторых библиотек с открытым исходным кодом, таких какelementUI
изform
Провести слой упаковки, чтобы он лучше обслуживал наш бизнес, но раз он так упакован, возникает проблема, как контролировать внутреннее при звонке.form
Как насчет всех событий, предоставляемых компонентом? Нельзя привязывать по одному.
В это время внутреннийform
Настройки компонентаv-on="$listeners"
$listeners
Входит в родительскую область (исключая.native
модификатор)v-on
прослушиватель событий. это может пройтиv-on="$listeners"
Передача внутренних компонентов — очень полезно при создании компонентов более высокого уровня, приведенный выше пример можно красиво решить следующим образом:
<template>
<div>
...
<el-form v-on="$listeners"/>
...
</div>
</template>
Конечно, если дочерний компонент является корневым элементом родительского компонента, вам не нужно писать это,Vue
Этот слой был сделан по умолчанию
5. Слоты области видимости разделяют пользовательский интерфейс и бизнес-логику
Много раз мы хотим повторно использовать бизнес-логику компонента, но не хотим использовать бизнес-логику компонента.UI
, то это можно реализовать с помощью слотов с областью действияUI
отделение от бизнес-логики.
Общая идея слота с прицелом состоит в том, чтобыDOM
Структура остается на усмотрение вызывающей стороны. Компонент обращает внимание только на бизнес-логику и, наконец, передает данные и события через:item ="item"
Метод передается родительскому компоненту для обработки и вызова, реализуя разделение пользовательского интерфейса и бизнес-логики. В сочетании с функцией рендеринга можно добиться эффекта отсутствия компонентов рендеринга.
Подробности смотрите в другой моей статье[Vue Advanced] От слота до компонента без рендеринга
Когда вызывается родительский компонент, это может быть похоже на это, где#row
даv-slot:row
аббревиатура
<!-- 父组件 -->
<template>
...
<my-table>
<template #row="{ item }">
/* some content here. You can freely use 'item' here */
</template>
</my-table>
...
</template>
<!-- 子组件 -->
<span>
<!-- 使用类似 v-bind:item="item",将子组件中的事件或者data传递给父组件-->
<slot v-bind:item="item">
{{ item.lastName }}
</slot>
</span>
Следует отметить, что до Vue 2.6
slot
а такжеslot-scope
, за которым следуетv-slot
6. Параметры динамической команды
существуетVue 2.6
Предоставляет такую возможность: вы можете динамически передавать директивные параметры компонентам. Предположим, у вас есть компонент <my-button>
, иногда вам нужно привязать событие кликаclick
, иногда нужно привязать событие двойного кликаdblclick
, на этот раз вы можете написать
<template>
...
<my-button @[someEvent]="handleSomeEvent()"/>
...
</template>
<script>
...
data(){
return{
...
someEvent: someCondition ? "click" : "dblclick"
}
},
methods:{
handleSomeEvent(){
// do something
}
}
...
</script>
7. Использование hookEvent
существуетVue 2.X
среди,hooks
можно использовать какEvent
,существуетVue
в исходном коде называетсяhookEvent
. Используя его, мы можем декларативно отслеживать хуки жизненного цикла подкомпонентов в шаблоне, чтобы мы могли добавлять обработчики жизненного цикла к сторонним компонентам.
Например, мы называем ресурсоемкий сторонний компонентList
, рендеринг этого компонента может занять много времени, для лучшего взаимодействия с пользователем мы хотимList
Когда компонент обновится, добавьтеloading
эффект анимации
В настоящее время мы можем подумать о непосредственном изменении исходного кода этого компонента, используяbeforeUpdate
а такжеupdated
показыватьloading
, но этот подход очень плох. Стоимость первой модификации относительно высока, а вторая не может пользоваться обновлением и обслуживанием этого компонента сообществом с открытым исходным кодом, вам нужно вручную поддерживать его самостоятельно.
В это время можно пройтиhookEvent
Хук-функция цикла декларативного объявления внедрения шаблона похожа на следующую:
<List @hook:updated="handleTableUpdated"></List >
Кроме того, мы также можем датьVue
Компонент добавляет обработчики жизненного цикла
vm.$on('hooks:created', cb)
vm.$once('hooks:created', cb)
Например, мы хотим уничтожить компонент, вызванный ранее, когда компонент будет уничтожен.В общем случае мы сделаем это:
Однако читаемость кода не очень хорошая, мы можем изменить его следующим образом, чтобы оптимизировать читаемость нашего кода и упростить наш код.Vue 3
решение проблем
8. Использование ключевых значений
существуетVue
в использованииv-for
, официальная рекомендация принестиkey
значение, потому что, если не используетсяkey
,Vue
По умолчанию для обновлений используется стратегия «повторного использования на месте». В некоторых случаях это может привести к неправильному рендерингу, о чем было сказано ранее.Опыт использования ключа для неправильного наступания на яму, вы можете увидеть, если вы заинтересованы
Кромеv-for
, В использованииVue-router
Работая над проектом, вы столкнетесь/path/:id
Это только меняетid
Нет сцены, но визуализировать разные компоненты. из-заrouter-view
многоразового использования, чистое изменениеid
номер не обновляетсяrouter-view
, это не то, что мы ожидали
В это время мы можем дать каждомуrouter-view
добавить другойkey
значение, пустьVue
Каждый раз, когда параметры маршрутизации переключаются, он считается другим компонентом и обновляется.
<router-view :key="key"></router-view>
На самом деле для всехDOM
,Vue
Можно принять стратегию повторного использования на месте, поэтому, если вы столкнулись с проблемой неправильного порядка рендеринга, вы можете перейти кkey
Соображения о направлении для установки стоимости
9. Пользовательские компоненты используют v-модель
мы знаем,v-model
даv-bind
так же какv-on
С синтаксическим сахаром, используемым в сочетании, следующие две реализации согласуются:
<input v-model="value" />
<input v-bind:value="value" v-on:input="value= $event.target.value" />
на компонентеv-model
По умолчанию он будет использовать имяvalue
Опора и имяinput
событий, но элементы управления вводом, такие как радиокнопки, флажки и т. д., могутvalue
Атрибуты используются для разных целей.
вv-model
Внутренне используйте разные для разных элементов вводаproperty
и бросать разные события:
- элементы text и textarea используют свойство value и событие ввода
- флажок и радио используют проверенное свойство и событие изменения
- поле выбора имеет значение как опору и изменение как событие
В приведенной выше ситуации, когда мы используем его в пользовательском компоненте, нам нужно использоватьmodel
Вариант, согласно официальному примеру, написалdemo
здесьlovingVue
Значение будет передано в этот именованныйchecked
изprop
. в то же время, когда<base-checkbox>
вызвать одинchange
событие с новым значением, этоlovingVue
изproperty
будет обновлено.
10. CSS-селекторы со шкалой и глубиной действия
существуетVue-loader
в, когда<style>
Этикетка имеетscoped
имущество, егоCSS
Работает только с элементом в текущем компоненте, это делается с помощьюPostCSS
для достижения следующего преобразования можно отметить, что.example
за которым следует [data-v-f3f3eg9], относящийся к элементу
<style scoped>
.example {
color: red;
}
</style>
<template>
<div class="example">hi</div>
</template>
<style>
.example[data-v-f3f3eg9] {
color: red;
}
</style>
<template>
<!-- 留意data-v-f3f3eg9 -->
<div class="example" data-v-f3f3eg9>hi</div>
</template>
Но иногда мы хотим смешивать локальные и глобальные стили, вы можете использовать как стили с областью, так и стили без области в одном компоненте.
<style>
/* 全局样式 */
</style>
<style scoped>
/* 本地样式 */
</style>
Но такой глобальный стиль может иметь некоторые побочные эффекты.Мы часто устанавливаем его так, но мы просто хотим установить стиль дочернего компонента в родительском компоненте. Поскольку родительский компонент устанавливаетscoped
После этого стили родительского компонента не будут проникать в дочерние компоненты
В настоящее время мы можем напрямую воздействовать на подкомпоненты с помощью селектора эффекта глубины, как показано ниже.
<style scoped>
.a >>> .b { /* ... */ }
</style>
будет компилироваться следующим образом:
.a[data-v-f3f3eg9] .b { /* ... */ }
некоторым нравитсяSass
препроцессоры, например, не могут правильно разобрать>>>
. В этом случае вы можете использовать/deep/
или ::v-deep
оператор вместо этого - оба>>>
Псевдоним для , который также отлично работает
11.watch immediate
Иногда мы хотим иметь в компонентеwatch
Значение, которое выполняет некоторые операции по инициализации и обновлению страницы, напримерthis.getDetails()
Аналогично следующему:
watch: {
id: {
handler(newValue) {
this.getDetails(newValue);
}
}
}
здесьwatch
Одной из особенностей является то, что он не будет выполняться при первоначальной привязке, а расчет мониторинга не будет выполняться до тех пор, пока не изменится id. Это может привести к неправильному отображению нашей страницы в первый раз.
хочу быть вwatch
объявлено вid
выполнить сразу послеhandler
метод, вы можете добавитьimmediate: true
watch: {
id: {
handler(newValue) {
this.getDetails(newValue);
},
// 代表在wacth里声明了id后这个方法之后立即先去执行handler方法
immediate: true
}
}
12. Использование JSX с Vue
JSX
этоJavascript
Расширение синтаксиса, JSX = Javascript + XML, т.е. вJavascript
написать внутриXML
,потому чтоJSX
Это свойство , поэтому он имеетJavascript
гибкость и одновременноhtml
Семантический и интуитивно понятный
Иногда мы используем функцию рендеринга (render function
) для абстрагирования компонента, а функцию рендеринга иногда очень больно писать.На данный момент мы можем использовать его в функции рендерингаJSX
Упростите наш код. Чтобы использовать JSX во Vue, вам нужно использовать плагин Babel, который позволяет нам вернуться к синтаксису, более близкому к шаблонам.Подробности см. в статье, которую я резюмировал ранее.[Advanced Vue] Научит вас использовать JSX в Vue
Например, общие инструкции могут быть записаны следующим образом:
render() {
{/* 指令 */}
{/* v-model */}
<div><input vModel={this.newTodoText} /></div>
{/* v-model 以及修饰符 */}
<div><input vModel_trim={this.tirmData} /></div>
{/* v-on 监听事件 */}
<div><input vOn:input={this.inputText} /></div>
{/* v-on 监听事件以及修饰符 */}
<div><input vOn:click_stop_prevent={this.inputText} /></div>
{/* v-html */}
<p domPropsInnerHTML={html} />
}
13.v-cloak решает проблему мерцания страницы
Во многих случаях данные в нашем шаблоне страницы получаются асинхронно.В случае плохой сети при отображении страницы появляется эффект мерцания страницы, что влияет на взаимодействие с пользователем.v-cloak
Директива остается в элементе до тех пор, пока связанный экземпляр не завершит компиляцию, используя его свойства в сочетании сCSS
правило[v-cloak] { display: none }
Используется вместе, чтобы скрыть нескомпилированныеMustache
маркировать, пока экземпляр не будет готов
// template 中
<div class="#app" v-cloak>
<p>{{value.name}}</p>
</div>
// css 中
[v-cloak] {
display: none;
}
Следует отметить, что хотя проблема с мерцанием решена, но если в этот период ничего не обрабатывать, экран будет гаснуть. Это не тот эффект, которого мы хотим.
loading
Или эффект каркасного экрана для улучшения взаимодействия с пользователем.
14. v-once и v-pre повышают производительность
мы знаемVue
Большая часть оптимизации производительности заключается в компиляции этого блока,Vue
В исходном коде есть операции, аналогичные маркировке статических узлов дляpatch
Процесс пропуска компиляции, что повышает производительность. Кроме того,Vue
при условииv-pre
Нам решать, пропускать ли процесс компиляции для этого элемента и его дочерних элементов. можно использовать для отображения оригиналаMustache
Этикетка. Пропуск большого количества узлов без инструкций ускоряет компиляцию.
<span v-pre>{{ this will not be compiled }}</span> 显示的是{{ this will not be compiled }}
<span v-pre>{{msg}}</span> 即使data里面定义了msg这里仍然是显示的{{msg}}
Также, если элементы и компоненты визуализируются только один раз. При последующем повторном рендеринге элемент/компонент и все его дочерние элементы будут рассматриваться как статическое содержимое и будут пропущены. можно использоватьv-once
<!-- 单个元素 -->
<span v-once>This will never change: {{msg}}</span>
<!-- 有子元素 -->
<div v-once>
<h1>comment</h1>
<p>{{msg}}</p>
</div>
<!-- 组件 -->
<my-component v-once :comment="msg"></my-component>
<!-- `v-for` 指令-->
<ul>
<li v-for="i in list" v-once>{{i}}</li>
</ul>
15. Функциональные компоненты
Функциональные компоненты относятся к компонентам, которые не имеют состояния, не могут быть созданы и не имеют каких-либо внутренних методов обработки жизненного цикла. Поскольку функциональные компоненты — это просто функции, накладные расходы на рендеринг также намного ниже. может быть объявленfunctional: true
, что указывает на то, что это функциональный компонент
Они очень полезны при использовании в качестве компонентов-оболочек.
- Вместо этого программно выберите один из нескольких компонентов для рендеринга.
- в воле
children
,props
,data
Манипулируйте дочерними компонентами, прежде чем передавать их в
Смотрите официальную демку, обратите внимание на комментарии
// 根据不同的情况渲染不同的组件
var EmptyList = { /* ... */ }
var TableList = { /* ... */ }
var OrderedList = { /* ... */ }
var UnorderedList = { /* ... */ }
Vue.component('smart-list', {
functional: true, // 声明 functional: true,表明它是一个函数式组件
props: {
items: {
type: Array,
required: true
},
isOrdered: Boolean
},
// 为了弥补缺少的实例
// 提供第二个参数作为上下文
render: function (createElement, context) { // 组件中所有的一切都是通过 context 传递的
// 根据不同的情况渲染不同的组件
function appropriateListComponent () {
var items = context.props.items
if (items.length === 0) return EmptyList
if (typeof items[0] === 'object') return TableList
if (context.props.isOrdered) return OrderedList
return UnorderedList
}
return createElement(
appropriateListComponent(),
context.data, // 传递给组件的整个数据对象
context.children // `VNode` 子节点的数组
)
}
})
Обратите внимание, что все в компоненте пропускается черезcontext
прошедший (render
второй параметр функции), такой как выше черезcontext.data
context.children
соответственно представляют весь объект данных, переданный компоненту, какcreateElement
Второй параметр входящего компонента иVNode
массив дочерних узлов, подробныйcontext
Содержание которого содержатся вОфициальный сайт
16. Используйте Vue.observable для обмена состоянием
Как всем известно,Vuex
Он специально используется для решения ситуации многокомпонентного разделения состояния, но, как иVuex
Согласно официальной документации, если приложение недостаточно большое, лучше его не использовать во избежание громоздкого и избыточного кода.
Vue.observable( object )
Сделайте объект отзывчивым.Vue
Внутреннее использование для обработкиdata
Объект, возвращаемый функцией. Возвращенный объект можно использовать непосредственно в функциях рендеринга и вычисляемых свойствах, и он будет запускать соответствующие обновления при возникновении изменений. Его также можно использовать как минимальное межкомпонентное хранилище состояний для простых сценариев, что-то вроде небольшогоVuex
Мы создаем новый файлstore.js
import Vue from "vue";
// 创建一个小型的 store,里面的数据可以实现多组件共享
export const store = Vue.observable({ count: 0 });
// 模糊VueX 的 mutation
export const mutations = {
setCount(count) {
store.count = count;
}
};
использовать в компонентеstore
значение и обновлениеstore
Значение в , вы можете увидеть конкретныеdemo
<template>
<div id="app">
<p>count:{{count}}</p>
<button @click="setCount(count+1)">+1</button>
<button @click="setCount(count-1)">-1</button>
</div>
</template>
<script>
import HelloWorld from "./components/HelloWorld";
import { store, mutations } from "./store";
export default {
name: "App",
components: {
HelloWorld
},
// 获取 store 中的数据
computed: {
count() {
return store.count;
}
},
// 更改 store 中的数据
methods: {
setCount: mutations.setCount
}
};
</script>
17. Форма ввода управления - модификатор формы / изменения события / фильтра / инструкция
Мы часто сталкиваемся с содержанием формы ввода контроля спроса, например, поле ввода должно быть цифрами, специальными символами и так не может быть. Здесь я предлагаю некоторые из моих собственных идей на ваш выбор.
модификатор формы
Если это простой управляющий ввод, он должен быть числом или удалить конечный пробел, введенный пользователем, вы можете использовать его напрямуюVue
Предоставленные модификаторы формы.number
а также.trim
Если вы хотите автоматически преобразовывать введенное пользователем значение в числовой тип, вы можете датьv-model
Добавить кnumber
Модификатор:
<input v-model.number="age" type="number">
Если вы хотите автоматически фильтровать начальные и конечные пробельные символы, введенные пользователем, вы можете указатьv-model
Добавить кtrim
Модификатор:
<input v-model.trim="msg">
изменить событие
Привязывайте события к форме и выполняйте управление вводом формы при обработке событий.
<input v-model="value2" type="text" @change="inputChange(value2)" />
methods: {
inputChange: function(val) {
if (!val) return ''
val = val.toString()
this.value2 = val.charAt(0).toUpperCase() + val.slice(1)
}
}
filter
тоже через фильтрfilter
провести
<input v-model="value1" type="text" />
Vue.filter('capitalize', function (value) {
if (!value) return ''
value = value.toString()
return value.charAt(0).toUpperCase() + value.slice(1)
})
watch: {
value1(val) {
this.value1 = this.$options.filters.capitalize(val);
}
}
Смотрите это для деталейdemo
инструкция
объявить глобальную директиву
// 只能输入正整数,0-9的数字
Vue.directive('enterIntNumber', {
inserted: function (el) {
let trigger = (el, type) => {
const e = document.createEvent('HTMLEvents')
e.initEvent(type, true, true)
el.dispatchEvent(e)
}
el.addEventListener("keyup", function (e) {
let input = e.target;
let reg = new RegExp('^\\d{1}\\d*$'); //正则验证是否是数字
let correctReg = new RegExp('\\d{1}\\d*'); //正则获取是数字的部分
let matchRes = input.value.match(reg);
if (matchRes === null) {
// 若不是纯数字 把纯数字部分用正则获取出来替换掉
let correctMatchRes = input.value.match(correctReg);
if (correctMatchRes) {
input.value = correctMatchRes[0];
} else {
input.value = "";
}
}
trigger(input, 'input')
});
}
});
использовать командное управление
<!--限制输入正整数-->
<input v-enterIntNumber placeholder="0" type="number">
18. Событие: специальная переменная $event
родное событие
Решите сцену: иногда, после того, как мы привязываем событие, мы хотим передать другие параметры, кроме собственного объекта события.
Прослушивание натуральногоDOM
Когда происходит событие, метод принимает собственный объект события в качестве единственного параметра (значение по умолчанию). Много раз мы хотим получить доступ к оригиналу во встроенном процессоре.DOM
События (и хотите передать другие параметры одновременно), вы можете использовать$event
передать его.
<!-- 注意这里调用的方法有两个参数 -->
<input v-model="value1" @change="inputChange('hello', $event)">
methods: {
inputChange(msg, e) {
console.log(msg, e);
}
}
пользовательское событие
В пользовательском событии$event
это значение, полученное из его дочерних компонентов
Сценарий: вы хотите отслеживатьel-input
При передаче переданного значения передайте другие параметры.
<el-input
v-model="value2"
@change="change($event, 'hello')"
placeholder="Input something here"
/>
methods: {
change(e, val) {
console.log("event is " + e); // el-input 输入的值
console.log(val); // hello
}
}
Смотрите это для деталейdemo
19. Шаблон отладки
Часто мы будем сталкиватьсяtemplate
Проблема переменных отчетов об ошибках в шаблоне, на данный момент мы хотели бы пройтиconsole.log
напечатайте в консоль, чтобы увидеть, каково его значение
// 这里最好是判断一下,只有在测试环境中才使用
// main.js
Vue.prototype.$log = window.console.log;
// 组件内部
<div>{{$log(info)}}</div>
видимыйdemo
20. Необходимый инструмент для разработки и отладки Vue — vue-devtools
vue-dev-tool
даVue
Официальный артефакт отладки с открытым исходным кодом, вы можете использовать его для четкого просмотра уровня компонента, изменений данных компонента,Vuex
данные и события и т. д. Специально для некоторых сложных приложений это решение может повысить эффективность вашей работы.
До встречи в Интернетеадрес 1
не вижуАдрес 2Есть ручная инструкция по установке
Кроме того,vscode
плагинVetur
Также рекомендую его вместе, поддержку подсветки синтаксиса, блоков кода и других функций, я лично считаю, что использованиеvscode
изVue
Обязательно для разработчиков
Суммировать
Vue
Порог обучения относительно низок, и мы можем решить большинство наших повседневных проблем, освоив некоторые распространенные способы использования. Но освоить все вышеперечисленноеVue
навыки, вы обязательно получите совершенно новый опыт
«Оказывается, Vue еще может так играть», если у вас есть такое чувство, поздравляю, попробуйте использовать эти навыки для решения каких-то своих задач, вы точно сможете добиться эффекта получения вдвое большего результата при половинных усилиях
Рекомендуемые отличные статьи в прошлом
- [Vue Advanced] — Как добиться прозрачной передачи атрибутов компонентов?
- Знание HTTP, которое должен знать внешний интерфейс
- Самый мощный макет CSS — макет сетки
- Как написать полное приложение Vue с помощью Typescript
- Инструмент веб-отладки, который должен знать внешний интерфейс — свисток