vue--学习(三)

一、组件之间的参数传递

1.父传子

父组件把参数传递给子组件

子组件

content

<template>
  <div id="app">
    欢迎你!{{name}},来自于{{address}}
    <br/>

  </div>
</template>

<script>
  export default{
    data:function(){
      return {
         name:"xiaoming"
      }
    },
    props:["address"]
  }
</script>

<style>
</style>

Props: 声明用于接收其他组件传递来的参数的属性名

props里可以是数组,数组里可以是对象

父组件

app.vue

<template>
  <div id="app">
    <Header></Header>
    <Content :address="message"></Content>
    <Bottom></Bottom>
  </div>
</template>

<script>

export default {
  name: 'app',
  data :function() {
    return {
       message:"杭州"
    }
  }
}
</script>

<style>
</style>

父组件中通过:

<Content :address="message"></Content>

向子组件传递参数

2.子父互传

3.改进版的子父传参

子组件

<template>
  <div id="app">
    欢迎你!{{name}},来自于{{address}}
    <br/>
    <button type="button" @click="btnfn('北京')">点我</button>

  </div>
</template>

<script>
  export default{
    data(){
      return {
         name:"xiaoming"
      }
    },
    // props:["address"]
    props:{
      "address":{
        type:String,
        required:true,
        default:"中国"
      },
      // "btnfn":{ //btnfn参数是一个方法
      //   type:Function
      // }
    },
    methods:{
      btnfn(add){
        this.$emit('newName',add);//子组件向上发射参数
      }
    }
  }
</script>

<style>
</style>

子组件通过:

  this.$emit('newName',add);

向上发射参数,父组件可以收到这个参数的键值对。

父组件

<template>
  <div id="app">
    <Header></Header>
    <!-- <Content :address="message" :btnfn="myFn"></Content> -->
    <Content :address="message" @newName="message=$event"></Content>
    <Bottom></Bottom>
  </div>
</template>

<script>

export default {
  name: 'app',
  data :function() {
    return {
       message:"杭州"
    }
  },
  mounted:function(){
    //当组件完成页面上的绑定以后会被调用
    this.message="上海"
  },
  methods:{
    myFn(add){
      this.message=add;
    }
  }
}
</script>

<style>
</style>

父组件收到参数后赋值给message

二、Vue中的Axios请求

vue只注重视图层,所以与后端交互的ajax,作者认为是不重要的。后面是需要的,于是vue之后推出了支持ajax模块,但是vue的该模块没有第三方Axios做的后,于是在2.0版本Vue就官方支持大家使用Axios实现Ajax请求。

1.注册页面

<template>
  <div id="app">
    <div style="width:50%" class="container">
    	<div>
    		<h3>Regist</h3>
    		<h5>Email</h5>
    		<input type="text" class="form-control" v-model.trim="mail" /><br />
    		{{mail}}
    		<h5>Password</h5>
    		<input type="password" class="form-control" v-model.lazy="password" /><br />
    		{{password}}
    		<h5>Gender</h5>
    		<input type="radio" name="gender" v-model="gender" value="female" />男
    		<input type="radio" name="gender" v-model="gender" value="male" />女<br />
        	{{gender}}
    		<h5>Hobby</h5>
    		<input type="checkbox" name="hobby" v-model="hobby" value="music">音乐
    		<input type="checkbox" name="hobby" v-model="hobby" value="movie">电影
    		<input type="checkbox" name="hobby" v-model="hobby" value="sport">运动
    		{{hobby}}
        <br/>
        <button type="button" class="btn btn-primary" @click="regist()">注册</button>
    	</div>
    </div>
  </div>
</template>

<script>
export default {
	data(){
		return {
			mail:"xxx@126.com",
			password:"",
			gender:"",
			hobby:[]
		}
	},
	methods:{
		regist:function(name){
			//把数据发送给后端,通过ajax请求,但是vue没有ajax,通过axios
		}
	}
}
</script>

2.项目中使用axios获得前端提交的注册的数据

  • 建数据库表
  • 创建后端项目
  • 生成entity mapper 接口
  • 创建controller接口
  • 使用Swagger2
  • 前端发送axios访问后端

3.Axios的使用

1)安装Axios

cnpm install --save axios vue-axios

在main.js中加入

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

Vue.use(VueAxios, axios)

2)在页面中使用axios请求

<template>
  <div id="app">
    <div style="width:50%" class="container">
    	<div>
    		<h3>Regist</h3>
    		<h5>Email</h5>
    		<input type="text" class="form-control" v-model.trim="name" /><br />

    		<h5>Password</h5>
    		<input type="password" class="form-control" v-model.lazy="password" /><br />
    		{{password}}
    		<h5>Gender</h5>
    		<input type="radio" name="gender" v-model="gender" value="男" />男
    		<input type="radio" name="gender" v-model="gender" value="女" />女<br />
        {{gender}}
    		<h5>Hobby</h5>
    		<input type="checkbox" name="hobby" v-model="hobby" value="music">音乐
    		<input type="checkbox" name="hobby" v-model="hobby" value="movie">电影
    		<input type="checkbox" name="hobby" v-model="hobby" value="sport">运动
    		{{hobby}}
        <br/>
        <button type="button" class="btn btn-primary" @click="regist()">注册</button>
    	</div>
    </div>
  </div>
</template>

<script>
export default {
	data(){
		return {
			name:"",
			password:"",
			gender:"",
			hobby:[]
		}
	},
	methods:{
	  regist:function(name){
      var hobby_str;
      var hob = this.hobby;
      //把数组变成字符串
      for(var i=0;i<hob.size;i++){
        if(i>0){
          hobby_str += ',';
        }
        hobby_str += hob[i];
      }
			//把数据发送给后端,通过ajax请求,但是vue没有ajax
      var vm = this;//把当前vue对象赋值给vm
      this.axios({
        method:'post',
        url:'http://localhost:8090/user/regist',
        data:{
          "name":vm.name,
          "password":vm.password,
          "gender":vm.gender,
          "hobby":hobby_str
        }
      }).then(function(response){
        if(response.data.code==1000){
          alert(response.data.message)
        }
      });
	 }
	}
}
</script>

3)axios的使用总结:

axios({
  method: 'post',  //请求方式
  url: '/user/12345', //请求的地址
  data: {    //携带的参数
    firstName: 'Fred',
    lastName: 'Flintstone'
  }
})
  .then(function (response) {  //返回的数据
    console.log(response);
  })
	.catch(function(error){
    console.log(error);
});
{
    "data": {
        "code": 1000,
        "message": "注册成功",
        "data": 1
    },
    "status": 200,
    "statusText": "",
    "headers": {
        "content-type": "application/json"
    },
    "config": {
        "url": "http://localhost:8090/user/regist",
        "method": "post",
        "data": "{\"name\":\"xiaoli\",\"password\":\"123\",\"gender\":\"女\"}",
        "headers": {
            "Accept": "application/json, text/plain, */*",
            "Content-Type": "application/json;charset=utf-8"
        },
        "transformRequest": [
            null
        ],
        "transformResponse": [
            null
        ],
        "timeout": 0,
        "xsrfCookieName": "XSRF-TOKEN",
        "xsrfHeaderName": "X-XSRF-TOKEN",
        "maxContentLength": -1,
        "maxBodyLength": -1
    },
    "request": {}
}

三、路由

1.路由的介绍

路由器中的“路由”,是用来选择一条可行的路径,在vue中路由实际上就是页面的切换——跳转。

实际上,在vue中的跳转,是设置一个router-view控件,让不同的vue组件在该router-view中进行展示。——vue中路由实现的逻辑

2.路由的安装

npm install vue-router -s

3.设计路由界面: Home.vue User.vue

4.创建路由表(在src下创建routes.js)

import Home from "./components/router/Home.vue";
import User from "./components/router/User.vue";

//创建一个路由表常量
export const routes = [
  {
    path:'/home',  //设置路径
    component:Home 
  },
  {
    path:'/user',
    component:User
  }
]

5.在main.js中注册路由表

import Vue from 'vue';
import App from './App.vue';
import Header from "./components/header.vue";
import Content from "./components/content.vue";
import Bottom from "./components/bottom.vue";
import axios from 'axios';
import VueAxios from 'vue-axios';
import VueRouter from 'vue-router' //1.引入路由模块
import {routes} from './routes'	//2.引入静态路由表

Vue.use(VueRouter); //3.使用路由模块
Vue.use(VueAxios, axios)

Vue.component("Header",Header);
Vue.component("Content",Content);
Vue.component("Bottom",Bottom);

//4.创建一个VueRouter模块的实例
const router = new VueRouter({
	routes:routes
});

new Vue({
  el: '#app',
  router,//5.把router实例放入到vue实例中
  render: h => h(App)
})


6.通过router-link和router-view来实现路由(App.vue)

<template>
  <div id="app">
    <div>
       <span>
         <router-link to="/home">首页</router-link>
        </span>
       <span>
         <router-link to="/user">用户管理页</router-link>
       </span>
    </div>
    <router-view></router-view>
  </div>
</template>

<script>

 // import Register from './components/register.vue';

export default {
  name: 'app',
  data :function() {
    return {
      
    }
  }
}
</script>

<style>
</style>


7.路由时的参数传递

  • 在路由表中配置路由的参数——设参
 {
    path:'/user/:id',  //配置了路由参数id
    component:User
  }

  • 在User组件中接收参数——接参
<template>
  <div>User
    用户的基本信息:
    <p>
      {{id}}
    </p>
    <p>
      {{name}}
    </p>
    <p>
      {{age}}
    </p>
    <p>
      {{gender}}
    </p>


  </div>
</template>

<script>
  export default{
    data(){
      return {
        id:this.$route.params.id,  //接收参数
        name:"",
        age:0,
        gender:""
      }
    },
    mounted(){
      //去通过axios请求,带着id去查询该用户的信息
      // this.axios({
      //   methods:'get',
      //   url:'/',

      // })
    }
  }
</script>

<style>
</style>


  • 在App.vue中传参-传参
<template>
  <div id="app">
    <div>
       <span>
         <router-link to="/home">首页</router-link>
        </span>
       <span>
         <!--通过/user/10来传参10-->
         <router-link to="/user/10">用户管理页</router-link>
       </span>
    </div>
    <router-view></router-view>
  </div>
</template>

<script>

//import Register from './components/register.vue';

export default {
  name: 'app',
  data :function() {
    return {

    }
  }
}
</script>

<style>
</style>


8.通过js代码实现路由跳转

通过js代码,而非通过router-link实现路由跳转

this.$router.push("/home");//通过js实现路由跳转

需要在User.vue中加入下面的代码

<template>
  <div>User
    用户的基本信息:
    <p>
      {{id}}
    </p>
    <p>
      {{name}}
    </p>
    <p>
      {{age}}
    </p>
    <p>
      {{gender}}
    </p>
    <button type="button" @click="goHome">回到首页</button>


  </div>
</template>

<script>
  export default{
    data(){
      return {
        id:this.$route.params.id,
        name:"",
        age:0,
        gender:""
      }
    },
    mounted(){
      //去通过axios请求,带着id去查询该用户的信息
      // this.axios({
      //   methods:'get',
      //   url:'/',

      // })
    },
    methods:{
      goHome(){
        this.$router.push("/home");  //通过js实现路由跳转
      }
    }
  }
</script>

<style>
</style>


四、mock假数据的用法

前端在开发的时候,已经有接口文档了,那么就可以直接通过mock假数据的方式让前端的项目跑通,而不需要等后端接口开发完成。

https://www.fastmock.site/

mock返回的数据形式

{
    "data": {
        "code": 1000,
        "message": "注册成功",
        "data": 1
    },
    "status": 200,
    "statusText": "",
    "headers": {
        "content-type": "application/json"
    },
    "config": {
        "url": "http://localhost:8090/user/regist",
        "method": "post",
        "data": "{\"name\":\"xiaoli\",\"password\":\"123\",\"gender\":\"女\"}",
        "headers": {
            "Accept": "application/json, text/plain, */*",
            "Content-Type": "application/json;charset=utf-8"
        },
        "transformRequest": [
            null
        ],
        "transformResponse": [
            null
        ],
        "timeout": 0,
        "xsrfCookieName": "XSRF-TOKEN",
        "xsrfHeaderName": "X-XSRF-TOKEN",
        "maxContentLength": -1,
        "maxBodyLength": -1
    },
    "request": {}
}

通过页面直接请求mock获取模拟后端数据(mouted钩子函数中)

<template>
	<div>User<br/>
	用户的基本信息:
	<p>{{id}}</p>
	<p>{{name}}</p>
	<p>{{age}}</p>
	<p>{{gender}}</p>
	<button type="button" @click="goHome()">回到首页</button>
	</div>
	
</template>

<script>
	export default{
		data(){
			return{
				id:this.$route.params.id,//接收参数
				name:"",
				age:0,
				gender:""
			}
		},
		mounted(){
			var vm =this;
			//去通过axios请求,带着id去查询该用户的信息
			this.axios({
				methods:'get',
				url:'https://www.fastmock.site/mock/38a087f24b20a74e67c93b0af2c8ec56/user/info/10',
			}).then(function(response){
				vm.name = response.data.name;
				vm.age = response.data.age;
				vm.gender = response.data.gender;
			});
		},
		methods:{
			goHome(){
				this.$router.push("/home");//通过js实现路由跳转
			}
		}
	}
</script>

<style>
</style>

五、使用Webpack骨架创建项目

1.安装webpack项目

vue init webpack 项目名称

2.使用element ui 组件开发

官网地址:https://element.eleme.cn/

  • 安装element ui
npm i element-ui -S

3.创建各种页面

Login.vue

<template>
  <div class="login-box">
    <el-form ref="form" :model="form" :rules="rules" label-width="80px">
      <h3 class="login-title">欢迎登录</h3>
      <el-form-item label="用户名" prop="name">
        <el-input v-model="form.name" placeholder="请输入用户名" ></el-input>
      </el-form-item>
      <el-form-item label="密码" prop="password">
        <el-input type="password" v-model="form.password" placeholder="请输入密码"></el-input>
      </el-form-item>

      <el-form-item >
        <el-button type="primary" @click="onSubmit('form')">登录</el-button>

      </el-form-item>


    </el-form>


  </div>
</template>

<script>
export default {
  name: "Login",
  data() {
    return {
      form: {
        name: '',
        password: ''
      },
      rules: {
        name: [
          { required: true, message: '请输入姓名', trigger: 'blur' },
          { min: 3, max: 12, message: '长度在 3 到 12 个字符', trigger: 'blur' }
        ],
        password: [
          { required: true, message: '请输入密码', trigger: 'blur' },
          { min: 3, max: 12, message: '长度在 3 到 12 个字符', trigger: 'blur' }
        ]

      }
    }
  },
  methods:{
    onSubmit(formName){
      this.$refs[formName].validate((valid) => {
        var vm = this;
        if (valid) {
           this.axios({
             method:'post',
             url:'https://www.fastmock.site/mock/70c016eea76630f57b1c6b118ebf6023/user/login',
             data:{
               "name":vm.name,
               "password":vm.password
             }
           }).then(function(response){
             console.log(response);
             var data = response.data;
             if(data.code==1000){
               //跳转
               vm.$message({
                   message: data.message,
                   type: 'success'
                });
                //做一个定时器
                setTimeout(function(){
                  //跳转
                  vm.$router.push("/main");
                },2000)
             }else{
               vm.$message.error('用户名或密码错误');
             }
           }).catch(function(error){
             vm.$message.error('当前网络不可用,请检查你的网络!');
           })

        } else {
           vm.$message.error('请按要求填入信息');
        }
      });


    }
  }
}
</script>

<style scoped>
  .login-box{

    width: 500px;
    height: 300px;
    border: 1px solid #DCDFE6;
    margin: 150px auto;
    padding: 20px 50px 20px 30px;
    border-radius: 20px;
    box-shadow: 0px 0px 20px #DCDFE6;



  }
  .login-title{
    text-align: center;
    margin-bottom: 40px;
  }
</style>


Main.vue

<template>
	<div>
		首页
	</div>
</template>

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

<style>
</style>

4.在路由表中注册新的组件

创建路由表 router / index.js

import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'
 
import Login from "../views/Login"
import Main from '../views/Main'

Vue.use(Router)

export default new Router({
  routes: [
    {
      path: '/',
      name: 'HelloWorld',
      component: HelloWorld
    },
    {
    	path:'/login',
    	name:'Login',
    	component:Login
    },
    {
    	path:'/main',
    	name:'Main',
    	component:Main
    }
  ]
})


配置路由main.js

// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import App from './App'
import VueRouter from 'vue-router'
import router from './router'
import axios from 'axios'
import VueAxios from 'vue-axios'

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

// 安装路由
Vue.use(VueRouter);
// 安装 ElementUI
Vue.use(ElementUI);
Vue.use(VueAxios, axios)
Vue.config.productionTip = false

/* eslint-disable no-new */
new Vue({
  el: '#app',
  //启用路由
  router,
  components: { App },
  template: '<App/>',
  // 启用 ElementUI
  render: h => h(App)
})


修改 App.vue

<template>
  <div id="app">
    <router-view/>
  </div>
</template>

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

<style>
</style>


5.安装axios,使用mock假数据

6.浏览器访问,走通流程

这样你就入门vue啦,满意的话关注我哦!!!

posted @ 2021-07-21 18:46  牛奶配苦瓜  阅读(48)  评论(0编辑  收藏  举报