今回は、Vue.js を改善する際に知っておくべきいくつかのポイントをまとめてご紹介します。Vue.js を改善するための 注意事項 について、実際の事例を見てみましょう。
最初のヒント: 複雑さを単純化するウォッチャー
シーンの復元:
created(){ this.fetchPostList() }, watch: { searchInputValue(){ this.fetchPostList() } }
コンポーネントが作成されると、リストを一度取得し、変更が発生するたびに同時に入力ボックスを監視します。このシナリオは非常に一般的です。これを最適化する方法はありますか?
動きの分析:
まず、ウォッチャーでは、関数のリテラル名を直接使用できます。次に、immediate: true を宣言すると、コンポーネントの作成時にすぐに実行されることになります。 りー
第 2 ステップ: コンポーネントを一度だけ登録しますシーン復元:
watch: { searchInputValue:{ handler: 'fetchPostList', immediate: true } }
import BaseButton from './baseButton' import BaseIcon from './baseIcon' import BaseInput from './baseInput' export default { components: { BaseButton, BaseIcon, BaseInput } }
私たちは基本的な UI コンポーネントを大量に作成しましたが、これらのコンポーネントを使用する必要があるたびに、最初にコンポーネントをインポートしてからコンポーネントを宣言する必要がありますが、これは非常に面倒です。できることなら怠けるという原則を守り、最適化する方法を見つけなければなりません。
動きの分析:
アーティファクト Webpack を使用し、
require.context() メソッドを使用して独自の (モジュール) コンテキストを作成し、自動動的 require コンポーネントを実装する必要があります。このメソッドは、検索するフォルダー ディレクトリ、そのサブディレクトリも検索するかどうか、およびファイルに一致する 正規表現 の 3 つのパラメーターを受け取ります。 global.js というファイルをコンポーネント フォルダーに追加し、webpack を使用して必要なすべての基本コンポーネントをこのファイルに動的にパッケージ化します。
りー最後に、main.js に「components/global.js」をインポートすると、これらの基本コンポーネントを手動で導入することなく、いつでもどこでも使用できるようになります。
3番目のトリック: ジョブを最大限に活用するルーターキー
シーンの復元:
次のシーンは多くのプログラマーの心を本当に打ちのめします... まず、デフォルトでは、誰もがルーティング制御を実装するために Vue-router を使用します。
ブログ Web サイトを作成していて、/post-page/a から /post-page/b にジャンプすることが要件だとします。するとなんとページが飛んだあとデータが更新されていないことが判明? !その理由は、vue-router がこれが同じコンポーネントであることを「賢く」発見し、このコンポーネントを再利用することを決定したため、作成された関数に記述したメソッドがまったく実行されなかったためです。通常の解決策は、次のように $route の変更をリッスンしてデータを初期化することです。 バグは解決しましたが、毎回こう書くのは野暮すぎませんか?怠けることができるなら怠けなさいという原則に従って、コードが次のように記述されることを期待します:
<BaseInput v-model="searchText" @keydown.enter="search" /> <BaseButton @click="search"> <BaseIcon name="search"/> </BaseButton>
動き分析:
では、この効果を実現するにはどうすればよいでしょうか? その答えは、たとえパブリック コンポーネントであっても、URL が変更される限りコンポーネントが再作成されるように、一意のキーを router-view に追加することです。 (パフォーマンスは少し低下しますが、無限のバグは回避されます)。同時に、キーをルートの完全なパスに直接設定し、一石二鳥であることに注意してください。
りー4 番目のトリック: 全能のレンダリング関数
シーンの復元: Vue では、各コンポーネントがルート要素を 1 つだけ持つ必要があります。複数のルート要素がある場合、Vue はエラーを報告します
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) })
。 動き分析:
それを解決する方法はありますか? 答えは「はい」ですが、現時点では、テンプレートの代わりに render() 関数を使用して HTML を作成する必要があります。実際、js を使用して HTML を生成する利点は、非常に柔軟で強力であり、v-for などの vue の機能が限定された命令 API の使い方を学ぶ必要がないことです。 v-if。 (reactjs はテンプレートを完全に破棄します)
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){ } }
5手目:何も動かさずに勝つことができるハイエンドコンポーネント
注意点:この技は非常に強力なので、ぜひマスターしてください コンポーネントを作成するときは、通常、一連の props を親コンポーネントから子コンポーネントに渡す必要があり、同時に親コンポーネントは子コンポーネントから発行された一連のイベントをリッスンします。例:
data() { return { loading: false, error: null, post: null } }, created () { this.getPost(this.$route.params.id) }, methods () { getPost(postId) { // ... } }
以下のような最適化ポイントがいくつかあります:
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 サイトの他の関連記事を参照してください。