溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Vue怎么將prop限制為類型列表

發(fā)布時間:2022-03-10 08:59:36 來源:億速云 閱讀:329 作者:iii 欄目:編程語言

本文小編為大家詳細(xì)介紹“Vue怎么將prop限制為類型列表”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“Vue怎么將prop限制為類型列表”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識吧。

Vue怎么將prop限制為類型列表

1. 將 prop 限制為類型列表

在 prop 定義中使用 validator 選項(xiàng),你可以將 prop 限制為一組特定的值:

export default {
  name: 'Image',
  props: {
    src: {
      type: String,
    },
    style: {
      type: String,
      validator: s => ['square', 'rounded'].includes(s)
    }
  }
};

這個 validator 函數(shù)接受一個 prop,返回 true 或 false。當(dāng)你需要比布爾值允許的更多選項(xiàng)時,也可以使用它。按鈕類型或警報(bào)類型(信息、成功、危險、警告)是一些比較常見的用途?!鞠嚓P(guān)推薦:vuejs視頻教程】

2. 默認(rèn)內(nèi)容和擴(kuò)展點(diǎn)

Vue 中的slot可以具有默認(rèn)內(nèi)容,你可以制作更易于使用的組件:

<button class="button" @click="$emit('click')">
  <slot>
    <!-- 如果沒有提供slot則使用 -->
    Click me
  </slot>
</button>

基本上你可以獲取組件的任何部分,將它包裝在一個slot中,然后你可以使用你想要的任何內(nèi)容覆蓋該組件的該部分。默認(rèn)情況下,它仍然會照常一樣工作,不過還可以有更多選擇:

<template>
  <button class="button" @click="$emit('click')">
    <!-- 一開始在 slot 標(biāo)簽中添加什么都不做 -->
    <!-- 我們可以通過向 slot 提供內(nèi)容來覆蓋它 -->
    <slot>
      <div class="formatting">
        {{ text }}
      </div>
    </slot>
  </button>
</template>

現(xiàn)在你可以用多種不同的方式使用此組件。簡單的默認(rèn)方式或者你自己的自定義方式:

<!-- 使用組件的默認(rèn)功能 -->
<ButtonWithExtensionPoint text="Formatted text" />

<!-- 使用擴(kuò)展點(diǎn)創(chuàng)建自定義行為 -->
<ButtonWithExtensionPoint>
  <div class="different-formatting">
    在這里做一些不同的事情
  </div>
</ButtonWithExtensionPoint>

3. 使用引號觀察嵌套值

你可能不知道這一點(diǎn):只需使用引號就可以輕松地直接查看嵌套值:

watch {
  '$route.query.id'() {
    // ...
  }
}

這對于處理深度嵌套的對象非常有用

4. 知道何時使用 v-if(以及何時避免使用)

有時不使用v-if,使用v-show會更高效:

<ComplicatedChart v-show="chartEnabled" />

當(dāng)v-if打開和關(guān)閉時,它將完全創(chuàng)建和銷毀元素。v-show不同的是將創(chuàng)建元素并將其留在那里,通過將其樣式設(shè)置為display: none來隱藏它。

如果你需要切換的組件渲染起來代價比較高,那么這樣做會更有效率。另一方面,如果你不需要立即使用那個組件,可以使用v-if以便它跳過渲染它并更快地加載頁面。

5. 單作用域 slot 的簡寫(不需要模板標(biāo)簽!)

Scoped slot 比較有趣,但為了使用它們,你也必須使用很多template標(biāo)簽。

然而有一個速記可以讓我們擺脫它,但前提是我們使用單個作用域slot。

可以不用這樣寫:

<DataTable>
  <template #header="tableAttributes">
    <TableHeader v-bind="tableAttributes" />
  </template>
</DataTable>

我們可以這樣寫:

<DataTable #header="tableAttributes">
  <TableHeader v-bind="tableAttributes" />
</DataTable>

這樣更簡單、直接。

6. 有條件地渲染slot

每個 Vue 組件都有一個特殊的 $slots 對象,其中包含所有slot。 默認(rèn)slot具有默認(rèn)鍵,名字命名的slot都使用它們的名稱作為鍵:

const $slots = {
  default: <default slot>,
  icon: <icon slot>,
  button: <button slot>,
};

但是這個$slots對象只有應(yīng)用于組件的slot,而不是每個定義的slot。

以這個定義了幾個slot的組件為例,包括幾個命名的slot:

<!-- Slots.vue -->
<template>
  <div>
    <h3>這里是一些slots</h3>
    <slot />
    <slot name="second" />
    <slot name="third" />
  </div>
</template>

如果我們只對組件應(yīng)用一個slot,則只有該slot會出現(xiàn)在我們的$slots對象中:

<template>
  <Slots>
    <template #second>
      這將應(yīng)用于第二個slot
    </template>
  </Slots>
</template>
$slots = { second: <vnode> }

我們可以在我們的組件中使用它來檢測哪些slot已應(yīng)用于組件,例如,通過隱藏slot的包裝元素:

<template>
  <div>
    <h3>一個包裹的slot</h3>
    <div v-if="$slots.default" class="styles">
      <slot />
    </div>
  </div>
</template>

現(xiàn)在div,應(yīng)用樣式的包裝器只有在我們實(shí)際用某些東西填充該slot時才會呈現(xiàn)。

如果我們不使用v-ifdiv如果我們沒有slot,我們最終會得到一個空的和不必要的。根據(jù)所div具有的樣式,這可能會弄亂我們的布局并使事情看起來很奇怪。

為什么我們希望能夠有條件地渲染slot呢?

使用條件slot主要有以下三個原因:

  • 使用 wrapper div 來添加默認(rèn)樣式時

  • slot是空的

  • 當(dāng)我們將默認(rèn)內(nèi)容與嵌套slot組合

例如,當(dāng)我們添加默認(rèn)樣式時,我們會在slot周圍添加一個div

<template>
  <div>
    <h3>This is a pretty great component, amirite?</h3>
    <div class="default-styling">
      <slot >
    </div>
    <button @click="$emit('click')">Click me!</button>
  </div>
</template>

但是,如果父組件沒有將內(nèi)容應(yīng)用到該slot,我們最終會在頁面div上呈現(xiàn)一個空的:

<div>
  <h3>這是一個非常棒的組件</h3>
  <div class="default-styling">
    <!-- slot中沒有內(nèi)容,但仍會呈現(xiàn)此 div-->
  </div>
  <button @click="$emit('click')">Click me!</button>
</div>

v-if在包裝上添加它div可以解決問題。沒有應(yīng)用到slot的內(nèi)容?像這樣:

<div>
  <h3>這是一個非常棒的組件</h3>
  <button @click="$emit('click')">Click me!</button>
</div>

7. 如何觀察slot的變化

有時我們需要知道slot內(nèi)的內(nèi)容什么時候發(fā)生了變化:

<!-- 可惜這個活動不存在 -->
<slot @change="update" />

可惜 Vue 沒有內(nèi)置的方法來檢測這一點(diǎn),使用突變觀察器一種非常簡潔的方法:

export default {
  mounted() {
    // 當(dāng)事情發(fā)生變化時調(diào)用`update`
    const observer = new MutationObserver(this.update);

    // 觀察這個組件的變化
    observer.observe(this.$el, {
      childList: true,
      subtree: true
    });
  }
};

8. 將本地和全局風(fēng)格混合在一起

通常在使用樣式時我們希望它們被限定為單個組件:

<style scoped>
  .component {
    background: green;
  }
</style>

如果你需要還可以添加一個非作用域樣式塊來添加全局樣式:

<style>
  /*全局應(yīng)用*/
  .component p {
    margin-bottom: 16px;
  }
</style>

<style scoped>
  /*范圍限定于此特定組件*/
  .component {
    background: green;
  }
</style>

9. 覆蓋子組件的樣式——正確的方法

Scoped CSS 比較容易保持整潔,并且不會意外地將樣式滲入應(yīng)用程序的其他部分。但有時你需要覆蓋子組件的樣式,并突破該范圍。Vue 有一個deep專門用于此的選擇器:

<style scoped>
/* 覆蓋子組件的 CSS,同時保持樣式范圍*/
.my-component >>> .child-component {
  font-size: 24px;
}
</style>

注意:如果你使用的是 SCSS 之類的 CSS 預(yù)處理器,則可能需要改用/deep/

10. 用上下文感知組件創(chuàng)造魔法

上下文感知組件是“神奇的”——它們可以自動適應(yīng)周圍發(fā)生的事情,處理邊緣情況,狀態(tài)共享等等。有 3 種主要類型的上下文感知組件,但是我覺得配置是其中最有趣的一種。

1. 狀態(tài)共享

當(dāng)你將一個大組件分解成多個小組件時,它們通常仍然需要共享狀態(tài)。你可以“在幕后”實(shí)現(xiàn)這一點(diǎn),而不是將這項(xiàng)工作推給使用組件的人。

可以將一個Dropdown組件分解為SelectOption組件以提供更大的靈活性。但是為了更容易使用,SelectOption組件彼此共享selected狀態(tài):

<!-- 為簡單起見用作單個組件 -->
<Dropdown v-model="selected" :options="[]" />

<!-- 拆分以獲得更大的靈活性 -->
<Select v-model="selected">
  <Option value="mustard">Mustard</Option>
  <Option value="ketchup">Ketchup</Option>
  <div class="relish-wrapper">
    <Option value="relish">Relish</Option>
  </div>
</Select>

2. 配置

有時需要根據(jù)應(yīng)用程序其余部分的情況更改組件的行為。這樣做通常是為了自動處理邊緣情況,否則會很麻煩。Popup或者Tooltip應(yīng)該重新定位自己,這樣它就不會溢出頁面。但是,如果該組件位于 modal 內(nèi)部,則它應(yīng)該重新定位自身,以免溢出modal。如果Tooltip知道它何時在模態(tài)內(nèi),這可以自動完成。

3. 造型

當(dāng)你創(chuàng)建了上下文感知 CSS,根據(jù)父元素或兄弟元素中發(fā)生的情況應(yīng)用不同的樣式。

.statistic {
  color: black;
  font-size: 24px;
  font-weight: bold;
}

/* 在彼此相鄰的統(tǒng)計(jì)數(shù)據(jù)之間進(jìn)行一些分離*/
.statistic + .statistic {
  margin-left: 10px;
}

CSS 中變量讓我們更進(jìn)一步允許我們在頁面的不同部分設(shè)置不同的值。

11. 如何使在 Vue 之外創(chuàng)建的變量具有響應(yīng)性?

如果你從 Vue 外部獲得一個變量,那么能夠使其具有響應(yīng)性就很好。這樣你就可以在計(jì)算道具、觀察者和其他任何地方使用它,它就像 Vue 中的任何其他狀態(tài)一樣工作。

當(dāng)你正在使用 options API,你只需將它放在data組件的部分中:

const externalVariable = getValue();

export default {
  data() {
    return {
      reactiveVariable: externalVariable,
    };
  }
};

當(dāng)你在 Vue 3 中使用組合 API,則可以使用refreactive這樣:

import { ref } from 'vue';

// 可以完全在 Vue 組件之外完成
const externalVariable = getValue();
const reactiveVariable = ref(externalVariable);

// 使用 .value 訪問
console.log(reactiveVariable.value);

使用reactive來代替:

import { reactive } from 'vue';

// 可以完全在 Vue 組件之外完成
const externalVariable = getValue();
// Reactive 僅適用于對象和數(shù)組
const anotherReactiveVariable = reactive(externalVariable);

// 直接訪問
console.log(anotherReactiveVariable);

如果你仍在使用 Vue 2(就像我們中的許多人一樣),你可以使用observable而不是reactive獲得完全相同的結(jié)果。

12. 在 v-for 中解構(gòu)

你知道你可以在 v-for 中解構(gòu)嗎?

<li
  v-for="{ name, id } in users"
  :key="id"
>
  {{ name }}
</li>

眾所周知,你可以使用這樣的元組從 v-for 中獲取索引:

<li v-for="(value, key) in [
  'Hai Yong',
  'Frozen',
  'Web Beginner'
]">
  {{ index + 1 }} - {{ value }}
</li>

使用對象時,你還可以抓住key:

<li v-for="(value, key) in {
  name: 'Hai Yong',
  released: 2021,
  director: 'A blogger',
}">
  {{ key }}: {{ value }}
</li>

也可以結(jié)合這兩種方法,獲取屬性的鍵和索引:

<li v-for="(value, key, index) in {
  name: 'Hai Yong',
  released: 2021,
  director: 'A blogger',
}">
  #{{ index + 1 }}. {{ key }}: {{ value }}
</li>

13. 在 Vue 中循環(huán)一個范圍

v-for指令允許我們遍歷一個數(shù)組,但它也讓我們遍歷一個范圍:

<template>
  <ul>
    <li v-for="n in 5">項(xiàng)目#{{ n }}</li>
  </ul>
</template>

顯示效果:

  • 項(xiàng)目#1

  • 項(xiàng)目#2

  • 項(xiàng)目#3

  • 項(xiàng)目#4

  • 項(xiàng)目#5

當(dāng)我們使用v-for范圍時,它將從 1 開始并以我們指定的數(shù)字結(jié)束。

14. 觀察組件中的任何內(nèi)容

你的組件中的任何響應(yīng)都可以被觀察到:

export default {
  computed: {
    someComputedProperty() {
      // 更新計(jì)算道具
    },
  },
  watch: {
    someComputedProperty() {
      // 當(dāng)計(jì)算的 prop 更新時做一些事情
    }
  }
};

你可以看:

  • 計(jì)算道具

  • 道具

  • 嵌套值

如果你使用組合 API,只要它是一個refreactive對象就可以監(jiān)視任何值,。

15. 竊取道具類型

從子組件復(fù)制 prop 類型,只是為了在父組件中使用它們。但竊取這些道具類型比只是復(fù)制它們要好得多。

例如,我們Icon在這個組件中使用了一個組件:

<template>
  <div>
    <h3>{{ heading }}</h3>
    <Icon
      :type="iconType"
      :size="iconSize"
      :colour="iconColour"
    />
  </div>
</template>

為了讓它工作,我們需要添加正確的道具類型,從Icon組件中復(fù)制:\

import Icon from './Icon';
export default {
  components: { Icon },
  props: {
    iconType: {
      type: String,
      required: true,
    },
    iconSize: {
      type: String,
      default: 'medium',
      validator: size => [
        'small',
        'medium',
        'large',
        'x-large'
      ].includes(size),
    },
    iconColour: {
      type: String,
      default: 'black',
    },
    heading: {
      type: String,
      required: true,
    },
  },
};

當(dāng)Icon組件的 prop 類型更新時,你肯定你會忘記回到這個組件并更新它們。隨著時間的推移,隨著該組件的 prop 類型開始偏離組件中的 prop 類型,將引入錯誤Icon

所以這就是為什么我們會竊取它們:

import Icon from './Icon';
export default {
  components: { Icon },
  props: {
    ...Icon.props,
    heading: {
      type: String,
      required: true,
    },
  },
};

除了在我們的示例中,我們在每個道具名稱的開頭添加了“icon”。所以我們必須做一些額外的工作來實(shí)現(xiàn)這一點(diǎn):

import Icon from './Icon';

const iconProps = {};

// Do some processing beforehand
Object.entries(Icon.props).forEach((key, val) => {
  iconProps[`icon${key[0].toUpperCase()}${key.substring(1)}`] = val;
});

export default {
  components: { Icon },
  props: {
    ...iconProps,
    heading: {
      type: String,
      required: true,
    },
  },
};

現(xiàn)在,如果Icon組件中的 prop 類型被修改,我們的組件將保持最新。

但是如果在Icon組件中添加或刪除了一個 prop 類型呢?為了涵蓋這些情況,我們可以使用v-bind計(jì)算道具來保持動態(tài)。

16. 檢測元素外部(或內(nèi)部)的點(diǎn)擊

有時我們需要檢測點(diǎn)擊是發(fā)生在特定元素el內(nèi)部還是外部。這是我們通常使用的方法:

window.addEventListener('mousedown', e => {
  // 獲取被點(diǎn)擊的元素
  const clickedEl = e.target;

  // `el` 是你正在檢測外部點(diǎn)擊的元素
  if (el.contains(clickedEl)) {
    // 單擊“el”內(nèi)部
  } else {
    // 在`el`之外點(diǎn)擊
  }
});

17. 遞歸槽

我們是否可以v-for只使用模板來制作一個組件?在此過程中,我發(fā)現(xiàn)了如何遞歸地使用slot。

這是組件的樣子:

<!-- VFor.vue -->
<template>
    <div>
        <!-- 渲染第一項(xiàng) -->
    {{ list[0] }}
        <!-- 如果我們有更多的項(xiàng)目可以繼續(xù),但需要離開我們剛剛渲染的項(xiàng)目 -->
    <v-for
      v-if="list.length > 1"
            :list="list.slice(1)"
        />
    </div>
</template>

如果你想用作用域slot來做這件事——為什么不呢?!— 只需要進(jìn)行一些調(diào)整:

<template>
  <div>
    <!-- 將項(xiàng)目傳遞到要渲染的slot中 -->
    <slot v-bind:item="list[0]">
      <!-- Default -->
      {{ list[0] }}
    </slot>

    <v-for
      v-if="list.length > 1"
      :list="list.slice(1)"
    >
      <!-- 遞歸向下傳遞作用域slot -->
      <template v-slot="{ item }">
        <slot v-bind:item="item" />
      </template>
    </v-for>
  </div>
</template>

以下是該組件的使用方法:

<template>
  <div>
    <!-- 常規(guī)列表 -->
    <v-for :list="list" />

    <!-- 帶有粗體項(xiàng)目的列表 -->
    <v-for :list="list">
      <template v-slot="{ item }">
        <strong>{{ item }}</strong>
      </template>
    </v-for>
  </div>
</template>

18. 組件元數(shù)據(jù)

并不是你添加到組件的每一點(diǎn)信息都是狀態(tài)。有時你需要添加一些元數(shù)據(jù)來為其他組件提供更多信息。

例如,如果你要為 Google Analytics 等分析儀表板構(gòu)建一堆不同的小部件:

Vue怎么將prop限制為類型列表

如果你希望布局知道每個小部件應(yīng)占用多少列,你可以將其作為元數(shù)據(jù)直接添加到組件上:

export default {
  name: 'LiveUsersWidget',
  // ? 只需將其添加為額外屬性
  columns: 3,
  props: {
    // ...
  },
  data() {
    return {
      //...
    };
  },
};

你會發(fā)現(xiàn)此元數(shù)據(jù)是組件上的一個屬性:

import LiveUsersWidget from './LiveUsersWidget.vue';
const { columns } = LiveUsersWidget;

你還可以通過特殊$options屬性從組件內(nèi)部訪問元數(shù)據(jù):

export default {
  name: 'LiveUsersWidget',
  columns: 3,
  created() {
    // `$options` 包含組件的所有元數(shù)據(jù)
    console.log(`Using ${this.$options.metadata} columns`);
  },
};

請記住,此元數(shù)據(jù)對于組件的每個實(shí)例都是相同的,并且不是響應(yīng)式的。

其他用途包括(但不限于):

  • 保留各個組件的版本號

  • 用于構(gòu)建工具的自定義標(biāo)志以區(qū)別對待組件

  • 向組件添加自定義功能,超出計(jì)算道具、數(shù)據(jù)、觀察者等。

19. 多文件單文件組件

這是 SFC 的一個鮮為人知的功能。你可以像使用常規(guī) HTML 文件一樣導(dǎo)入文件:

<!-- "single" 文件組件 -->
<template src="./template.html"></template>
<script src="./script.js"></script>
<style scoped src="./styles.css"></style>

如果你需要共享樣式、文檔或其他任何內(nèi)容這會很方便。也非常適合那些因滾動而磨損手指的超長組件文件

20. 可重用組件不是你想的那樣

可重用組件不一定是大的或復(fù)雜的東西,我經(jīng)常使小而短的組件可重復(fù)使用。因?yàn)槲也粫教幹貙戇@段代碼,更新它變得容易得多,而且我可以確保每個OverflowMenu看起來和工作完全一樣——因?yàn)樗鼈兪且粯拥模?/p>

<!-- OverflowMenu.vue -->
<template>
  <Menu>
    <!-- 添加自定義按鈕來觸發(fā)我們的菜單 -->
    <template #button v-slot="bind">
      <!-- 使用 bind 傳遞點(diǎn)擊處理程序、a11y 屬性等。 -->
      <Button v-bind="bind">
        <!-- 使用我們自己的“...”圖標(biāo),此按鈕沒有文字 -->
        <template #icon>
          <svg src="./ellipsis.svg" />
        </template>
      </Button>
    </template>
  </Menu>
</template>

這里我們使用了一個Menu組件,但是在觸發(fā)它打開的按鈕上添加了一個“...”(省略號)圖標(biāo)??赡懿⒉徊恢档糜盟鼇碇谱骺芍赜玫慕M件,因?yàn)樗挥袔仔?。每次我們想使?code>Menu這樣的時候,我們不能只添加圖標(biāo)嗎?但這OverflowMenu將使用數(shù)十次,現(xiàn)在如果我們想要更新圖標(biāo)或其行為,我們可以很容易地做到。而且使用起來也簡單多了!

<template>
  <OverflowMenu
    :menu-items="items"
    @click="handleMenuClick"
  />
</template>

21. 從組件外部調(diào)用方法

你可以通過給它一個從組件外部調(diào)用方法ref

<!-- Parent.vue -->
<template>
  <ChildComponent ref="child" />
</template>
// Parent.vue 中的某個地方
this.$refs.child.method();

通常,我們使用道具和事件在組件之間進(jìn)行通信。道具被發(fā)送到子組件,事件被發(fā)送回父組件。

<template>
  <ChildComponent
    :tell-me-what-to-do="someInstructions"
    @something-happened="hereIWillHelpYouWithThat"
  />
</template>

但有時你可能會遇到需要父組件觸發(fā)子組件中的方法的情況。這是只有向下傳遞道具不起作用的地方??梢韵蛳聜鬟f一個布爾值并讓子組件監(jiān)視它:

<!-- Parent.vue -->
<template>
  <ChildComponent :trigger="shouldCallMethod" />
</template>
// Child.vue
export default {
  props: ['trigger'],
  watch: {
    shouldCallMethod(newVal) {
      if (newVal) {
        // 當(dāng)觸發(fā)器設(shè)置為 `true` 時調(diào)用該方法
        this.method();
      }
    }
  }
}

這工作正常,但僅限于第一次調(diào)用。如果你需要多次觸發(fā)此操作,則必須清理并重置狀態(tài)。然后邏輯看起來像這樣:

  • Parent 組件傳遞truetriggerprop

  • Watch被觸發(fā),Child組件調(diào)用方法

  • Child 組件發(fā)出一個事件告訴 Parent 組件該方法已成功觸發(fā)

  • Parent 組件重置triggerfalse,因此我們可以再次執(zhí)行此操作

啊。

相反,如果我們在子組件上設(shè)置ref ,我們可以直接調(diào)用該方法:

<!-- Parent.vue -->
<template>
  <ChildComponent ref="child" />
</template>
// Parent.vue 中的某個地方
this.$refs.child.method();

我們打破了“props down, events up”規(guī)則,打破了封裝,但它更清晰、更容易理解值得這樣做!

有時,“最佳”解決方案最終會成為最差的解決方案。

22. 觀察數(shù)組和對象

使用觀察者最棘手的部分是有時候它似乎不能正確觸發(fā)。一般都是因?yàn)槟阍噲D查看一個數(shù)組或一個對象,但沒有設(shè)置deeptrue

export default {
  name: 'ColourChange',
  props: {
    colours: {
      type: Array,
      required: true,
    },
  },
  watch: {
    // 使用對象語法而不僅僅是方法
    colours: {
      // 這將讓 Vue 知道查看數(shù)組內(nèi)部
      deep: true,

      // 我們必須將我們的方法移動到處理程序字段
      handler()
        console.log('顏色列表已更改!');
      }
    }
  }
}

使用 Vue 3 的反應(yīng)式 API 看起來像這樣:

watch(
  colours,
  () => {
    console.log('顏色列表已更改!');
  },
  {
    deep: true,
  }
);

如果你想了解更多信息,可以參閱Vue 3和Vue 2的文檔。

23. 與 Vue Router 深度鏈接

你可以在 URL 中存儲(一些)狀態(tài),允許你直接跳轉(zhuǎn)到頁面上的特定狀態(tài)。

比如你可以加載一個已選擇日期范圍過濾器的頁面:

someurl.com/edit?date-range=last-week

這對于用戶可能共享大量鏈接的應(yīng)用程序部分、服務(wù)器呈現(xiàn)的應(yīng)用程序或在兩個獨(dú)立應(yīng)用程序之間傳遞比常規(guī)鏈接通常提供的信息更多的信息非常有用。

你可以存儲過濾器、搜索值、模式是打開還是關(guān)閉,或者我們滾動到的列表中的位置——非常適合無限分頁。

使用vue-router這樣的方式獲取查詢(這也適用于 Nuxt 和 Vuepress 等大多數(shù) Vue 框架):

const dateRange = this.$route.query.dateRange;

要更改它,我們使用RouterLink組件并更新query

<RouterLink :to="{
  query: {
    dateRange: newDateRange
  }
}">

24. 模板標(biāo)簽的另一種用途

template標(biāo)簽可以在模板內(nèi)的任何地方使用,以更好地組織代碼。

我喜歡用它來簡化v-if邏輯,有時v-for也是。

在這個例子中,我們有幾個元素都使用相同的v-if條件:\

<template>
  <div class="card">
    <img src="imgPath" />
    <h4>
      {{ title }}
    </h4>
    <h5 v-if="expanded">
      {{ subheading }}
    </h5>
    <div v-if="expanded" class="card-content">
      <slot/>
    </div>
    <SocialShare v-if="expanded" />
  </div>
</template>

這有點(diǎn)笨拙,一開始并不明顯,一堆這些元素被顯示和隱藏在一起。在更大、更復(fù)雜的組件上,這可能是更糟糕的情況!

但我們可以解決這個問題。

我們可以使用template標(biāo)簽對這些元素進(jìn)行分組,并將其提升v-iftemplate標(biāo)簽本身:\

<template>
  <div class="card">
    <img src="imgPath" />
    <h4>
      {{ title }}
    </h4>
    <template v-if="expanded">
      <h5>
        {{ subheading }}
      </h5>
      <div class="card-content">
        <slot/>
      </div>
      <SocialShare/>
    </template>
  </div>
</template>

25. 處理錯誤(和警告)的更好方法

你可以為 Vue 中的錯誤和警告提供自定義處理程序:

// Vue 3
const app = createApp(App);
app.config.errorHandler = (err) => {
  alert(err);
};

// Vue 2
Vue.config.errorHandler = (err) => {
  alert(err);
};

Bugsnag 和 Rollbar 等錯誤跟蹤服務(wù)掛接到這些處理程序中以記錄錯誤,但你也可以使用它們來更優(yōu)雅地處理錯誤以獲得更好的用戶體驗(yàn)。

例如,如果錯誤未得到處理,應(yīng)用程序不僅會崩潰,還可以顯示整頁錯誤屏幕并讓用戶刷新或嘗試其他操作。

在 Vue 3 中,錯誤處理程序僅適用于模板和觀察程序錯誤,但 Vue 2 錯誤處理程序幾乎可以捕獲所有內(nèi)容。兩個版本中的警告處理程序僅適用于開發(fā)。

讀到這里,這篇“Vue怎么將prop限制為類型列表”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點(diǎn)還需要大家自己動手實(shí)踐使用過才能領(lǐng)會,如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI