ホームページ > 記事 > ウェブフロントエンド > Vue.js のウォッチャー、コンポーネント、ルーティング制御
今回は、Vue.js のウォッチャー、コンポーネント、ルーティング制御について説明します。実際のケースを見てみましょう。
ほとんどの人は、Vue.js の基本的な API をいくつかマスターした後、すでにフロントエンド Web サイトを通常どおり開発できます。しかし、Vue を使用してより効率的に開発し、Vue.js のマスターになりたい場合は、これから説明する 5 つのコツを真剣に勉強する必要があります。
最初のステップ: 簡略化されたウォッチャー
シーン復元:
created(){ this.fetchPostList() }, watch: { searchInputValue(){ this.fetchPostList() } }
コンポーネントが作成されると、リストを一度取得し、変更があるたびに同時に入力ボックスを監視します。このシナリオは非常に一般的ですが、最適化する方法はありますか?
ムーブ分析:
まず第一に、ウォッチャーでは関数のリテラル名を直接使用できます。次に、immediate: true を宣言すると、コンポーネントの作成時にすぐに実行されることを意味します。
watch: { searchInputValue:{ handler: 'fetchPostList', immediate: true } }
第 2 ステップ: コンポーネントの登録を一度だけ行います
シーンの復元:
import BaseButton from './baseButton' import BaseIcon from './baseIcon' import BaseInput from './baseInput' export default { components: { BaseButton, BaseIcon, BaseInput } }
<BaseInput v-model="searchText" @keydown.enter="search" /> <BaseButton @click="search"> <BaseIcon name="search"/> </BaseButton>
基本的な UI コンポーネントを大量に作成しました。これらのコンポーネントを使用する必要があるたびに、最初にそれらをインポートする必要があります。そしてコンポーネントを宣言するのは非常に面倒です。できることなら怠けるという原則を守り、最適化する方法を見つけなければなりません。
Move 分析:
自動動的な require コンポーネントを実現するには、アーティファクト Webpack を使用し、require.context() メソッドを使用して独自の (モジュール) コンテキストを作成する必要があります。このメソッドは、検索するフォルダー ディレクトリ、そのサブディレクトリも検索するかどうか、およびファイルと一致する正規表現の 3 つのパラメーターを受け取ります。
global.js というファイルをコンポーネントフォルダーに追加し、webpack を使用して、必要なすべての基本コンポーネントをこのファイルに動的にパッケージ化します。
import Vue from 'vue' function capitalizeFirstLetter(string) { return string.charAt(0).toUpperCase() + string.slice(1) } const requireComponent = require.context( '.', false, /\.vue$/ //找到components文件夹下以.vue命名的文件 ) requireComponent.keys().forEach(fileName => { const componentConfig = requireComponent(fileName) const componentName = capitalizeFirstLetter( fileName.replace(/^\.\//, '').replace(/\.\w+$/, '') //因为得到的filename格式是: './baseButton.vue', 所以这里我们去掉头和尾,只保留真正的文件名 ) Vue.component(componentName, componentConfig.default || componentConfig) })
最後に、main.js に「components/global.js」をインポートすると、これらの基本コンポーネントを手動で導入することなく、いつでもどこでも使用できるようになります。
3番目のトリック: お金を奪うルーターキー
シーン復元:
次のシーンは多くのプログラマーの心を本当に打ち砕きます... まず第一に、デフォルトでは、誰もが制御にVue-routerを使用します。ルーティング。 。
ブログ Web サイトを作成していて、要件が /post-page/a から /post-page/b にジャンプすることであると仮定します。するとなんとページが飛んだあとデータが更新されていないことが判明? !その理由は、vue-router がこれが同じコンポーネントであることを「賢く」発見し、このコンポーネントを再利用することを決定したため、作成された関数に記述したメソッドがまったく実行されなかったためです。通常の解決策は、次のように $route の変更を監視してデータを初期化することです:
data() { return { loading: false, error: null, post: null } }, watch: { '$route': { handler: 'resetData', immediate: true } }, methods: { resetData() { this.loading = false this.error = null this.post = null this.getPost(this.$route.params.id) }, getPost(id){ } }
バグは解決されましたが、毎回このように書くのはあまりにも洗練されていませんか?できることなら怠けるという原則に従って、コードが次のように記述されることを願っています:
data() { return { loading: false, error: null, post: null } }, created () { this.getPost(this.$route.params.id) }, methods () { getPost(postId) { // ... } }
動き分析:
どうすればそのような効果を達成できるでしょうか? 答えは、ルーターに一意のキーを追加することです。これにより、パブリック コンポーネントであっても、URL が変更される限り、このコンポーネントは再作成されます。 (パフォーマンスは少し低下しますが、無限のバグは回避されます)。同時に、キーをルートの完全なパスに直接設定し、一石二鳥であることに注意してください。
<router-view :key="$route.fullpath"></router-view>
4 番目のトリック: 全能のレンダリング関数
シーン復元:
vue では、各コンポーネントがルート要素を 1 つだけ持つ必要があります。複数のルート要素がある場合、vue はエラーを報告します。動きの分析:
それを解決する方法はありますか? 答えは「はい」ですが、現時点では、テンプレートの代わりに render() 関数を使用して HTML を作成する必要があります。実際、js を使用して HTML を生成する利点は、非常に柔軟で強力であり、v-for や v-if などの Vue の機能が限定された命令 API の使い方を学ぶ必要がないことです。 (reactjs はテンプレートを完全に破棄します)
<template> <li v-for="route in routes" :key="route.name" > <router-link :to="route"> {{ route.title }} </router-link> </li> </template> ERROR - Component template should contain exactly one root element. If you are using v-if on multiple elements, use v-else-if to chain them instead.5 番目のトリック: 高レベルのコンポーネントを獲得するためのトリックはありません
キーポイント: このトリックは無限に強力です。必ずマスターしてください
コンポーネントを作成するとき、通常は Weすべては親コンポーネントから子コンポーネントに一連の props を渡す必要があり、同時に親コンポーネントは子コンポーネントから発行された一連のイベントをリッスンします。例:
functional: true, render(h, { props }) { return props.routes.map(route => <li key={route.name}> <router-link to={route}> {route.title} </router-link> </li> ) }
には次の最適化ポイントがあります:
1.每一个从父组件传到子组件的props,我们都得在子组件的Props中显式的声明才能使用。这样一来,我们的子组件每次都需要申明一大堆props, 而类似placeholer这种dom原生的property我们其实完全可以直接从父传到子,无需声明。方法如下:
<input :value="value" v-bind="$attrs" @input="$emit('input', $event.target.value)" >
$attrs包含了父作用域中不作为 prop 被识别 (且获取) 的特性绑定 (class 和 style 除外)。当一个组件没有声明任何 prop 时,这里会包含所有父作用域的绑定,并且可以通过 v-bind="$attrs" 传入内部组件——在创建更高层次的组件时非常有用。
2.注意到子组件的@focus=$emit('focus', $event)"其实什么都没做,只是把event传回给父组件而已,那其实和上面类似,我完全没必要显式地申明:
<input :value="value" v-bind="$attrs" v-on="listeners" > computed: { listeners() { return { ...this.$listeners, input: event => this.$emit('input', event.target.value) } } }
$listeners包含了父作用域中的 (不含 .native 修饰器的) v-on 事件监听器。它可以通过 v-on="$listeners" 传入内部组件——在创建更高层次的组件时非常有用。
3.需要注意的是,由于我们input并不是BaseInput这个组件的根节点,而默认情况下父作用域的不被认作 props 的特性绑定将会“回退”且作为普通的 HTML 特性应用在子组件的根元素上。所以我们需要设置inheritAttrs:false,这些默认行为将会被去掉, 以上两点的优化才能成功。
相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!
推荐阅读:
以上がVue.js のウォッチャー、コンポーネント、ルーティング制御の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。