個人的な方向性 - Vue クイック スタート

1. はじめに

  • Vue (/vjuː/ と発音、ビューに似ています) は、ユーザー インターフェイスを構築するための進歩的なフレームワークです。他の大きなフレームワークとは異なり、Vue は下から上にレイヤーごとに適用されるように設計されています。Vue のコア ライブラリはビュー レイヤー (HTML+CSS+JS) のみに焦点を当てており、使いやすいだけでなく、サードパーティのライブラリや既存のプロジェクトとの統合も簡単です。一方、最新のツールチェーンやさまざまなサポート ライブラリと組み合わせると、Vue は複雑なシングルページ アプリケーションを実行することもできます。(公式紹介)

  • Vueは中国人のYou Yuxiによって開発されました。

  • ビュー層に加えて、フロントエンドにはネットワーク通信 (通常は axios を使用)、ページジャンプ (vue-router)、および状態管理 (vuex) もあります。

  • Vue公式サイト

関連する原則:

  • Soc: (関心事の分離) Soc 原則: 関心事の分離の原則は、コンピューティング フロントエンドで使用される最も基本的な原則です。もちろんVueもそれに従う
  • MVVM: Vue.js は、View レイヤーに重点を置いた MVVM スタイルの双方向データ バインディングを提供する Javascript ライブラリです。そのコアは MVVM の VM、つまり ViewModel です。ViewModel は、ビューとモデルを接続してビューとデータの一貫性を確保する役割を担っており、この軽量アーキテクチャにより、フロントエンド開発がより効率的かつ便利になります。

MVVM:
Model-View-ViewModel —— イベント駆動型プログラミング (主な目的はビューとモデルを分離することです)
ViewModel 双方向バインディング層: ViewModel によってカプセル化されたデータ モデルには、状態と動作の 2 つの部分が含まれます。ビュー、およびモデル層のデータ モデルには状態のみが含まれます。

2. 初級編(基礎文法)

一般的にはHTMLにVueを導入することで直接Vueを利用することができます。

<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.js"></script><!--或者下面的也行-->
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.min.js"></script>

1. 最初のエントリ

基本的な HTML 形式を使用します。コードには <body> 部分のみが含まれます。

<body>

<!--view层 模板-->
<div id="app">
    {
    
    {
    
    message}}//从data中取数据
</div>

<!--1.导入vue.js-->
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.min.js"></script>
<script>
    var vm=new  Vue({
    
    
        el:"#app",
        //Model:数据
        data:{
    
    
            message:"hello,vue!"
        }
    });
</script>

2.v-バインド

<!--view层 模板-->
<div id="app">
    <span v-bind:title="message">
        鼠标悬停查看动态绑定的信息
    </span>
</div>

<!--1.导入vue.js-->
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.min.js"></script>
<script>
    var vm=new  Vue({
    
    
        el:"#app",
        //Model:数据
        data:{
    
    
            message:"hello,vue!"
        }
    });
</script>

3. ジャッジメントループ

判断:

<!--view层 模板-->
<div id="app">
    <h1 v-if="ok">True</h1>
    <h1 v-else>No</h1>
</div>

<!--1.导入vue.js-->
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.min.js"></script>
<script>
    var vm=new  Vue({
    
    
        el:"#app",
        //Model:数据
        data:{
    
    
            ok:true
        }
    });
</script>

サイクル:

<!--view层 模板-->
<div id="app">
    <h1 v-if="type==='A'">A</h1>
    <h1 v-else-if="type==='B'">B</h1>
    <h1 v-else-if="type==='C'">C</h1>
    <h1 v-else>D</h1>
</div>

<!--1.导入vue.js-->
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.min.js"></script>
<script>
    var vm=new  Vue({
    
    
        el:"#app",
        //Model:数据
        data:{
    
    
            type:'A'
        }
    });
</script>

4. イベントバインディング


<!--view层 模板-->
<div id="app">
    <button v-on:click="sayHi">click here</button>
</div>

<!--1.导入vue.js-->
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.min.js"></script>
<script>
    var vm=new  Vue({
    
    
        el:"#app",
        //Model:数据
        data: {
    
    
            message:"大海"
        },
        methods:{
    
    //
            //方法必须定义在Vue的Method对象种
            sayHi:function (){
    
    
                alert(this.message)
            }
        }
    });
</script>

5. データ双方向バインディング

以下に 2 つの例を示します

<!--view层 模板-->
<div id="app">
    性别:
    <input type="radio" name="sex" value="男" v-model="person" /><input type="radio" name="sex" value="女" v-model="person" /><p>
        选中了:{
    
    {
    
    person}}
    </p>
    <br />
    输入的文本:<textarea v-model="message" ></textarea>{
    
    {
    
    message}}
</div>

<!--1.导入vue.js-->
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.min.js"></script>
<script>
    var vm=new  Vue({
    
    
        el:"#app",
        //Model:数据
        data:{
    
    
            message:"",
            person:''
        }
    });
</script>

ドロップダウン ボックスの双方向バインド:

<!--view层 模板-->
<div id="app">
    下拉框:
    <select name="" id="" v-model="selected">
        <option value="" disabled>---请选择---</option>
        <option>A</option>
        <option>B</option>
        <option>C</option>
        <option>D</option>
    </select>

    <span>value:{
    
    {
    
    selected}}</span>
</div>

<!--1.导入vue.js-->
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.min.js"></script>
<script>
    var vm=new  Vue({
    
    
        el:"#app",
        //Model:数据
        data:{
    
    
            selected:''
        }
    });
</script>

6.vueコンポーネント

コンポーネントは再利用可能な Vue インスタンス (再利用可能なテンプレート)

<!--
“绑定item的值”也是一个变量,命名为item_bind什么的也行,这里只是方便区别
-->

<!--view层 模板-->
<div id="app">

    <!--组件:传递给组件中的值:props-->
    <person v-for="item in items" v-bind:绑定item的值="item"></person>
</div>

<!--1.导入vue.js-->
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.min.js"></script>
<script>

    //定义一个Vue组件component
    Vue.component("person",{
    
    
        props:["绑定item的值"],
        template:'<li>{
    
    {绑定item的值}}</li>'
    });

    var vm=new  Vue({
    
    
        el:"#app",
        //Model:数据
        data:{
    
    
            items:["java","linux","mac"]
        }
    });
</script>

7. Axios 非同期通信

Axios はブラウザや NodeJS で利用できるオープンソースの非同期通信フレームワークであり、主な機能は AJAX 非同期通信を実現することです。
スクリプトを導入する必要があります:

<script src="https://unpkg.com/axios/dist/axios.min.js"></script>

新しい data.json ファイルを作成する

{
    
    
  "name": "java",
  "url": "https://www.baidu.com/",
  "page": 1,
  "isNonProfit": true,
  "address": {
    
    
    "street": "含光门",
    "city": "陕西西安",
    "country": "中国"
  },
  "links": [
    {
    
    
      "name": "B站",
      "url": "https://www.bilibili.com/"
    },
    {
    
    
      "name": "csdn",
      "url": "https://www.csdn.net/"
    },
    {
    
    
      "name": "百度",
      "url": "https://www.baidu.com/"
    }
  ]
}

デモ.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        [v-cloak]{
    
    
            display: none;
        }
    </style>
</head>
<body>
<!--view层 模板-->
<!--
    ps:这里打开网页会闪烁:   {
    
    {
    
    message.name}}------------》java   加载
    手动解决:
      <style>
        [v-cloak]{
    
    
            display: none;
        }
     </style>
     打开网页       白屏------------》java   加载
-->
<div id="vue" v-cloak>

    <div>{
    
    {
    
    message.name}}</div>
    <div>{
    
    {
    
    message.address.city}}</div>

    <a v-bind:href="message.url">百度</a>

</div>

<!--1.导入vue.js-->
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.js"></script>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script>
    var vm=new Vue({
    
    
        el:"#vue",
        data(){
    
    
            return{
    
    
                message:{
    
    /*这里直接     message:''   不写也可以   */
                    name:null,
                    city:null,
                    address:{
    
    
                        street:null,
                        city:null,
                        country:null
                    }
                }
            }
        },
        mounted(){
    
    //钩子函数 链式编程
            axios.get('./data.json').then(response=>(this.message=response.data));
        }
    });
</script>
</body>
</html>

8. 計算されたプロパティ

<!--view层 模板-->
<div id="app">

    <!--
        currentTime1():是方法,在网页中console.log中调用 vm.currentTime1()   会显示不同的值
        currentTime2:是属性    在网页中console.log中调用 vm.currentTime2()    会报错,因为它不是方法,重复调用vm.currentTime2值不会变化
      因为currentTime2是属性,计算出来后保存到了内存中   ,和缓存类似,如果 currentTime2内属性值变化 例如:在网页控制台中输入:vm.message="3",  currentTime2
      会重新计算

    -->

    <!--
        计算属性的主要特征就是为了将不经常变化的计算结果进行缓存,以节约我们的习题开销
    -->
    <P>currentTime1:{
    
    {
    
    currentTime1()}}</P>
    <P>currentTime2:{
    
    {
    
    currentTime2}}</P>

</div>

<!--1.导入vue.js-->
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.min.js"></script>
<script>
    var vm=new  Vue({
    
    
        el:"#app",
        data:{
    
    
            message:"hello,world"
        },
        methods:{
    
    
            currentTime1:function (){
    
    
                return Date.now();  //返回当前一个时间戳
            }
        },
        computed:{
    
    //    计算属性:   methods. computed   方法不能重名      vm.currentTime2 is not a function   currentTime2是属性
            currentTime2:function (){
    
    
                this.message;
                return Date.now();  //返回当前一个时间戳
            }
        }
    });
</script>

9. スロットスロット

<!--view层 模板-->
<div id="app">
<!-- 
网页输出:
	<p>列表数据</p>
	<ul>
		<li>鲁迅</li>
		<li>周树人</li>
		<li>狂人</li>
	</ul>
  -->
    <todo>
        <todo-title slot="todo-title" :title="title"></todo-title>
        <todo-items slot="todo-items" v-for="item in names" :item="item"></todo-items>
    </todo>

</div>

<!--1.导入vue.js-->
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.min.js"></script>
<script>

    //slot:插槽
    Vue.component("todo",{
    
    
        template:
        '<div>' +
            '<slot name="todo-title"></slot>' +
            '<ul>'  +
                '<slot name="todo-items"></slot>' +
            '</ul>' +
        '</div>'
    });

    Vue.component("todo-title",{
    
    
        props:['title'],
        template: '<div style="color: blue">{
    
    {title}}</div>'
    });

    Vue.component("todo-items",{
    
    
        props:['item'],
        template: '<li>{
    
    {item}}</li>'
    });

    var vm=new  Vue({
    
           //Vue有先后顺序,这个要放到最后,不然会报错
        el:"#app",
        //Model:数据
        data:{
    
    
            title:"列表",
            names:['鲁迅','周树人','狂人']
        }
    });
</script>

10. カスタムイベントコンテンツの配信


<!--view层 模板-->
<div id="app">
    <todo>
        <todo-title slot="todo-title" :title="title"></todo-title>
        <todo-items slot="todo-items" v-for="(item,index) in names" :item="item"
                    v-bind:绑定index的值="index" v-on:绑定remove方法="removeItems(index)"></todo-items>
    </todo>

</div>

<!--1.导入vue.js-->
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.min.js"></script>
<script>

    //slot:插槽
    Vue.component("todo",{
    
    
        template:
            '<div>' +
            '<slot name="todo-title"></slot>' +
            '<ul>'  +
            '<slot name="todo-items"></slot>' +
            '</ul>' +
            '</div>'
    });

    Vue.component("todo-title",{
    
    
        props:['title'],
        template: '<div style="color: blue">{
    
    {title}}</div>'
    });

    Vue.component("todo-items",{
    
    
        props:['item','绑定index的值'],
        //只能绑定当前组件的方法
        template: '<li>{
    
    {绑定index的值}}--{
    
    {item}} <button @click="remove">删除</button></li>',
        methods:{
    
    
            remove:function (绑定index的值){
    
    
                //this.$emit()  自定义事件分发
                this.$emit('绑定remove方法',绑定index的值)
            }
        }
    });

    var vm=new  Vue({
    
           //据说Vue又先后顺序,这个要放到最后,不然会报错??    未验证
        el:"#app",
        //Model:数据
        data:{
    
    
            title:"列表",
            names:['鲁迅','周树人','狂人']
        },
        methods: {
    
    
            removeItems:function (index){
    
    
                this.names.splice(index,1);    //一次删除下标为index的一个元素
            }
        }
    });
</script>

3. Vue-cli (vue スキャフォールディング)

Vue CLI は、Vue.js に基づいた迅速な開発のための完全なシステムです
。 vue-cli をグローバルにインストールします。

npm install -g vue-cli


いいえ、cnpm install -g vue-cli : vue -Vでバージョンを確認します。

1. 初期化

新しい空のフォルダーを作成し、空のフォルダーの場所の cmd 入力を開きます。

vue init webpack myvue

そうでない場合は、管理者で cmd を開く必要があります

詳細:
vue init webpack myvue(ファイル名)
ロード後、cmd はプロジェクトの基本情報を表示し、オプションを次の順序で入力できます。 デフォルト デフォルトの作成者名 最初のオプション (スタンドアロン) no no no no no,i

次に、myvue プロジェクトが生成され、cmd が /myvue フォルダーに切り替わります
。ターミナル入力:

npm 実行開発

Web ページが http://localhost:8080 で開き、空の vue-cli が正常に実行されます。

2.idea は Vue コンポーネント オプションを使用せずに Vue プラグインをインストールします

ここでは、Vue.js プラグインを直接ダウンロードするだけで、アイデアを使用して Vue を開発できます。
ダウンロード後、新しいビルドにコンポーネント オプションに対する解決策がない場合:

  1. ファイルをクリックして設定を開き、エディターを展開してファイルとコードのテンプレートを見つけます
  2. Vue の単一ファイル コンポーネントを見つけて選択し、[コピー] をクリックします
  3. コピーすると下部に新しいファイルが表示されます
  4. 名前を「Vue Component」に変更し、コード内の「COMPONENT_」を削除して、最後に「OK」をクリックして終了します。

四、vue-router

Vue Router は、Vue.js の公式ルーティング マネージャーです(新しいウィンドウが開きます)。

 コードの簡単な例を示します:
同じフレームを持つ Web サイトが多数あり、ボタンを押すとメイン表​​示領域のみが更新されます。同じ効果を実現するために vue-router を使用します。

空の vue-cli プロジェクト内:
vue-router ルートをダウンロードします。

npm install vue-router --save-dev

1. 空の vue-cli ファイルの src/main.js でルーティングを構成します。

import Vue from 'vue'
import App from './App'
import router from './router'   //自动扫描里面的路由配置

Vue.config.productionTip = false	// 阻止启动生产消息,默认的

new Vue({
    
    
  el: '#app',
  //配置路由
  router,
  components: {
    
     App },
  template: '<App/>'
})
	

3 つのページと 1 つのメイン ページができました。メイン ページのボタンを使用して、他の 3 ページを切り替えて表示したいと思います。
2. 3 つのページ (コンポーネント):
Content.vue:

<template>
  <h1>一些乱七八糟的内容</h1>
</template>

<script>
export default {
    
    
  name: "Content"
}
</script>

<style scoped>  /*  scoped  当前页面起效  */

</style>

人物ビュー:

<template>
    <h2>person</h2>
</template>

<script>
export default {
    
    
  name: "person"
}
</script>

<style scoped>

</style>

メインビュー:

<template>
  <h1>首页</h1>
</template>

<script>
export default {
    
    
  name: "Main"
}
</script>

<style scoped>

</style>

3. エクスポート ルートを設定します。
src/ の下に新しいファイル router/index.js を作成します。

import Vue from "vue";
import VueRouter from "vue-router";

import Content from '../components/Content';
import Main from '../components/Main';
import Person from '../components/Person';

//安装路由
Vue.use(VueRouter);

//配置导出路由
export default new VueRouter({
    
    
  routes:[
    {
    
    
      //路由路径
      path:'/main',
      name:'content',
      //跳转的组件
      component:Main
    },
    {
    
    
      //路由路径
      path:'/content',
      name:'content',
      //跳转的组件
      component:Content
    },
    {
    
    
      //路由路径
      path:'/person',
      //name可以不用
      //跳转的组件
      component:Person
    }
  ]
});

4. ホームページ:

<template>
  <div id="app">
    <h1>Vue-Router</h1>
    <router-link to="/main">首页</router-link>
    <router-link to="/content">内容页</router-link>
    <router-link to="/person">个人页</router-link>
    <router-view></router-view>
  </div>
</template>

<script>

export default {
    
    
  name: 'App'
}
</script>

<style>
#app {
    
    /*默认的主页css,删掉也行*/
  font-family: 'Avenir', Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

次に、ターミナルに直接入力します (現在のルート ディレクトリに切り替えるため):
npm run dev
プロジェクトを実行します (デフォルト: http://localhost:8080)
ポート 8080 が占有されている場合、ポートは移動されます。

五、Vue-ElementUI

ElementUI: Vueに適したUIフレームワーク
公式Webサイトコンポーネント

1. 事前準備:

  1. Webpack プロジェクトの初期化
    vue init webpack hello-vue(ファイル名)
  2. cd hello-vue - ディレクトリを切り替えます
  3. vue-router をインストールします
    cnpm install vue-router --save-dev を使用して
               現在のディレクトリを保存します
  4. element-ui
    cnpm i element-ui -sをインストールします

  5. インストールはnpm installに依存します
  6. sass ローダーをインストールする
    cnpm install sass-loader node-sass --save-dev
  7. テストを開始する
    npm run dev
  8. アイデアオープンプロジェクト

2. シンプルなプロジェクトコード

新しい router と views フォルダーを src/ の下に作成します。
新しい index.js ファイルを router/ の下に作成します。
新しい Main.vue および Login.vue ファイルを views/ の下に作成します。

完全なプロジェクトを最初にここに示し、関連するコードを紹介します。

事前に axios をインストールし、ターミナル入力: cnpm install --save axios vue-axios

(1). ルートディレクトリ (/hello-vue) に新しい /static/mock/data.json を作成します。

{
    
    
  "name":"person",
  "url": "https://www.baidu.com/",
  "page": 1,
  "isNonProfit":true,
  "address": {
    
    
    "street": "含光门",
    "city":"陕西西安",
    "country": "中国"
  },
  "links": [
    {
    
    
      "name": "B站",
      "url": "https://www.bilibili.com/"
    },
    {
    
    
      "name": "4399",
      "url": "https://www.4399.com/"
    },
    {
    
    
      "name": "百度",
      "url": "https://www.baidu.com/"
    }
  ]
}

(2). src/main.js ファイルを変更します。


import Vue from 'vue'
import App from './App'

import router from './router'

//导入element-ui和css文件
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';

import axios from 'axios'
import VueAxios from 'vue-axios'

Vue.use(VueAxios,axios);

Vue.use(router);
Vue.use(ElementUI);


new Vue({
    
    
  el: '#app',
  router,
  render:h=>h(App)  //ElementUI
})

(3).コンポーネント

メインビュー:

<template>
  <div>
    <el-container>
      <el-aside width="200px">
        <el-menu :default-openeds="['1']">

          <el-submenu index="1">
            <template slot="title"><i class="el-icon-caret-right"></i>用户管理</template>
            <el-menu-item-group>
              <el-menu-item index="1-1">
                <!--插入的地方-->
                <!--  <router-link to="/user/profile">个人信息</router-link>  -->
                <!--  name-传组件名 params传递参数,需要对象:v-bind (:to)   -->
                <router-link :to="{name: 'UserProfile',params: {id: 1}}">个人信息</router-link>
              </el-menu-item>
              <el-menu-item index="1-2">
                <!--插入的地方-->
                <router-link to="/user/list">用户列表</router-link>
              </el-menu-item>
              <el-menu-item index="1-3">
                <router-link to="/goHome">回到首页</router-link>
              </el-menu-item>
            </el-menu-item-group>
          </el-submenu>

          <el-submenu index="2">
            <template slot="title"><i class="el-icon-caret-right"></i>内容管理</template>
            <el-menu-item-group>
              <el-menu-item index="2-1">分类管理</el-menu-item>
              <el-menu-item index="2-2">内容列表</el-menu-item>
            </el-menu-item-group>
          </el-submenu>

          <el-submenu index="3">
            <template slot="title"><i class="el-icon-caret-right"></i>系统管理</template>
            <el-menu-item-group>
              <el-menu-item index="3-1">用户设置</el-menu-item>
            </el-menu-item-group>
          </el-submenu>

        </el-menu>
      </el-aside>

      <el-container>
        <el-header style="text-align: right; font-size: 12px">
          <el-dropdown>
            <i class="el-icon-setting" style="margin-right: 15px"></i>
            <el-dropdown-menu slot="dropdown">
              <el-dropdown-item>个人信息</el-dropdown-item>
              <el-dropdown-item>退出登录</el-dropdown-item>
            </el-dropdown-menu>
          </el-dropdown>

<!--          <span>{
    
    {
    
    name}}</span>-->

        </el-header>

        <el-main>
          <!--在这里展示视图-->
          <router-view />
        </el-main>

      </el-container>
    </el-container>
  </div>
</template>

<script>
export default {
    
    
  // props:['name'],
  name: "Main"
}
</script>

<style scoped > /*  <style scoped lang="scss"> lang="scss" 项目没有对scss进行支持 */
.el-header {
    
    
  background-color: #25b1ff;
  color: #333;
  line-height: 60px;
}
.el-aside {
    
    
  color: #333;
}
</style>

Login.vue:

<template>
  <div>
    <el-form ref="loginForm" :model="form" :rules="rules" label-width="80px" class="login-box">
      <h3 class="login-title">欢迎登录</h3>
      <el-form-item label="账号" prop="username">
        <el-input type="text" placeholder="请输入账号" v-model="form.username"/>
      </el-form-item>
      <el-form-item label="密码" prop="password">
        <el-input type="password" placeholder="请输入密码" v-model="form.password"/>
      </el-form-item>
      <el-form-item>
        <el-button type="primary" v-on:click="onSubmit('loginForm')">登录</el-button>
      </el-form-item>
    </el-form>

    <el-dialog title="温馨提示" :visible.sync="dialogVisiable" width="30%" :before-close="handleClose">
      <span>请输入账号和密码</span>
      <span slot="footer" class="dialog-footer">
          <el-button type="primary" @click="dialogVisible = false">确定</el-button>
        </span>
    </el-dialog>
  </div>
</template>

<script>
export default {
    
    
  name: "Login",
  data(){
    
    
    return{
    
    
      form:{
    
    
        username:'',
        password:''
      },
      //表单验证,需要在 el-form-item 元素中增加prop属性
      rules:{
    
    
        username:[
          {
    
    required:true,message:"账号不可为空",trigger:"blur"}
        ],
        password:[
          {
    
    required:true,message:"密码不可为空",tigger:"blur"}
        ]
      },

      //对话框显示和隐藏
      dialogVisible:false
    }
  },
  methods:{
    
    
    onSubmit(formName){
    
    
      //为表单绑定验证功能
      this.$refs[formName].validate((valid)=>{
    
    
        if(valid){
    
    
          //使用vue-router路由到指定界面,该方式称为编程式导航
          this.$router.push('/main');
          /*this.$router.push('/main/'+this.form.username);*/
        }else{
    
    
          this.dialogVisible=true;
          return false;
        }
      });
    }
  }
}
</script>

<style  scoped>/* <style lang="scss" scoped>    lang="scss" 有问题 因为项目没有对scss进行支持,需要另外安装第三方包的依赖来对scss进行解析 */
.login-box{
    
    
  border:1px solid #DCDFE6;
  width: 350px;
  margin:180px auto;
  padding: 35px 35px 15px 35px;
  border-radius: 5px;
  -webkit-border-radius: 5px;
  -moz-border-radius: 5px;
  box-shadow: 0 0 25px #909399;
}
.login-title{
    
    
  text-align:center;
  margin: 0 auto 40px auto;
  color: #303133;
}
</style>

NotFound.vue:

<template>
  <div>
    <h1>404,没有找到该页面</h1>
  </div>
</template>

<script>
export default {
    
    
  name: " NotFound"
}
</script>

<style scoped>

</style>

(3-2).コンポーネント


新しい user/List.vue と Profile.vue List.vue をviews/ の下に作成します。

<template>
  <h1>用户列表</h1>
</template>

<script>
export default {
    
    
  name: "UserList"
}
</script>

<style scoped>

</style>

プロフィール.ビュー:

<template>
  <div>
    <h1>个人信息</h1>
<!--    {
    
    {
    
     $route.params.id }}-->
    {
    
    {
    
    id}}
  </div>
</template>

<script>
export default {
    
    
  props:['id'],
  name: "UserProfile",
  /* 过滤器 进入路由之前 */
  beforeRouteEnter:(to,from,next)=>{
    
    
    next(vm => {
    
     //跳入下一页面    next('/path’);跳入另一个路由 next(false)返回原来的页面 next((vm)=>{})仅在beforeRouteEnter中可用。vm是组件实例
      vm.getData();  //进入路由之前执行getData
    });
  },
  /* 在进入路由后*/
  beforeRouteLeave:(to,from,next)=> {
    
    
    next();
  },
  methods:{
    
    
    getData:function (){
    
    
      this.axios({
    
    
        method:'get',
        url:'http://localhost:8080/static/mock/data.json'
      }).then(function (response){
    
    
        console.log(response)
      })
    }
  }
}
</script>

<style scoped>

</style>

(4)index.js(設定ルーティング)

import Vue from 'vue'
import Router from 'vue-router'

import Main from '../views/Main'
import Login from "../views/Login"

import UserList from '../views/user/List'
import UserProfile from "../views/user/Profile"

import NotFound from "../views/NotFound"

Vue.use(Router);

export default new Router({
    
    
  mode:'history',
  routes:[
    {
    
    
      path:'/login',
      component:Login
    },
    {
    
    
      // path:'/main/:name',
      path:'/main/',
      component:Main,  //嵌套路由
      props:true,
      children:[
        /*{path:'/user/profile',component:UserProfile},*/
        {
    
    path:'/user/profile/:id' , name:'UserProfile',component:UserProfile,props:true},
        {
    
    path:'/user/list',component:UserList}
      ]
    },{
    
    
      path:'/goHome',
      redirect: '/main'
    },{
    
    
      path:'*',
      component: NotFound
    }
  ]
});

ここでプロジェクトを実行できます。ターミナル入力: npm run dev
webpage open: http://localhost:8080/login と
入力してログインし、次のように入力します: http://localhost:8080/main

3. コードの詳細

(1). パラメータの受け渡し

1>>Main.vue で:

<!--  <router-link to="/user/profile">个人信息</router-link>  -->
<!--  name-传组件名 params传递参数,需要对象:v-bind (:to)   -->
<router-link :to="{name: 'UserProfile',params: {id: 1}}">个人信息</router-link>

id: 1 — 渡す必要があるパラメータです

2>>
index.js Mainの子サブルートのパスを変更します

{パス:'/user/profile/:id' 、名前:'ユーザープロファイル'、コンポーネント:ユーザープロファイル}

3>> Profile.vue コンポーネントに渡した後、
{ { $route.params.id }} を使用してページに表示します

ps: テンプレートの下に存在できるラベルは 1 つだけです

(2) パラメータの小道具のデカップリングを渡す

1>>Main のサブルートの子を変更し、props:true を追加します。

2>>Profile.vue のエクスポートに props:['id'] を追加します

3>> Profile.vue 内の { { $route.params.id }} を { {id}}に置き換えます

(3) リダイレクト

Index.js のエクスポートのルートに追加します:
{ path:'/goHome', redirect: '/main' }


Main.vueを追加

<el-menu-item index="1-3">
    <router-link to="/goHome">回到首页</router-link>
</el-menu-item>

(4) ログインページに接続します

これは後続のテストに影響するため、
使用後に 1>>modify login.vue をコメントアウトします。

/*this.$router.push('/main');*/
this.$router.push('/main/'+this.form.username);

2>>index.jsを変更する

path:'/main/:name',
// path:'/main/',
component:Main,  //嵌套路由
props:true,

3>>Main.vue を変更し、
<script> のエクスポートに props:['name'] を追加し
、Main.vue の </el-header> の最後に追加します。

</el-dropdown>
	<span>{
    
    {
    
    name}}</span>
</el-header>

このとき、ログイン時に入力したユーザー名がmianページに表示されます。

(5) ルーティング

Index.js のエクスポートは、
# のないパスのスタイルである mode:'history' で始まります。
デフォルトは、# を含むパス (URL) である mode:'hash' です。

(6)404

エラー ページを構成します
。index.js ページのエクスポート ルートの最後に構成します。

{
      path:'*',
      component: NotFound
}

*、ルート内のパスに表示されるアドレスを除き、その他はすべてエラーにジャンプします

  routes:[
    {
    
    
      path:'/login',
      component:Login
    },
    {
    
    
      // path:'/main/:name',
      path:'/main/',
      component:Main,  //嵌套路由
      props:true,
      children:[
        /*{path:'/user/profile',component:UserProfile},*/
        {
    
    path:'/user/profile/:id' , name:'UserProfile',component:UserProfile,props:true},
        {
    
    path:'/user/list',component:UserList}
      ]
    },{
    
    
      path:'/goHome',
      redirect: '/main'
    },{
    
    
      path:'*',
      component: NotFound
    }
  ]

(7) ルーティングフック

Axios をインストールする必要があります (上記でインストールされていない場合: cnpm install --save axios vue-axios)
Profile.vue を変更します

export default {
    
    
  props:['id'],
  name: "UserProfile",
  /* 过滤器 进入路由之前 */
  beforeRouteEnter:(to,from,next)=>{
    
    
    next(vm => {
    
     //跳入下一页面    next('/path’);跳入另一个路由 next(false)返回原来的页面 next((vm)=>{})仅在beforeRouteEnter中可用。vm是组件实例
      vm.getData();  //进入路由之前执行getData
    });
  },
  /* 在进入路由后*/
  beforeRouteLeave:(to,from,next)=> {
    
    
    next();
  },
  methods:{
    
    
    getData:function (){
    
    
      this.axios({
    
    
        method:'get',
        url:'http://localhost:8080/static/mock/data.json'
      }).then(function (response){
    
    
        console.log(response)
      })
    }
  }
}

メイン ページのこの時点で、コンソールを開いて data.json 内のデータを確認します。

おすすめ

転載: blog.csdn.net/youxizaixian123/article/details/121431346
おすすめ