文本框封装
实现子父组件值双向绑定
子组件通过$emit把input框监听到的值发送给父组件
//子组件
<div>
<input
@input="handleInput"
class="myInput"
type="text"
placeholder="请输入用户名/手机号"
:value="value"
/>
</div>
<script>
export default {
porps:{"value"}
methods: {
handleInput(e) {
//把输入框的值发送给父组件
this.$emit("input", e.target.value);
},
},
};
</script>
------------------------
//父组件
<div class="loginBody">
//把userName传到子组件,并用getUserName监听子组件发出的input事件
<my-input @input="getUserName" :value="userName"></my-input>
</div>
<script>
data() {
return {
userName: "Tom",
};
},
methods:{
getUserName(v):{
//赋值给userName
this.userName = v
}
}
</script>
- 用V-model封装(v-model双向绑定的实现原理)
//子组件
//少了动态取值props的value
<div>
<input
@input="handleInput"
class="myInput"
type="text"
placeholder="请输入用户名/手机号"
/>
</div>
<script>
export default {
methods: {
handleInput(e) {
//把输入框的值发送给父组件
//此时e.target.value就是父组件传值的userName
this.$emit("input", e.target.value);
},
},
};
</script>
------------------------
//父组件
<div class="loginBody">
//v-model代替了 @input="getUserName" :value="userName"
//v-model默认把值传给value,并且监听了input事件
<my-input v-model="userName"></my-input>
</div>
<script>
data() {
return {
userName: "Tom",
};
},
//不需要再设定input监听事件来进行赋值修改
</script>
总结:
1.v-model实现了给Input框value赋值,并监听了input框发出的事件
2.在子组件使用的时候赋值,默认会添加到子组件的根元素上
路由封装
//在router文件夹中新建文件index.js,引用的时候直接输入路径,会自动匹配文件夹中的index文件
//模块化工程,必须通过Vue.use()安装,所以首先引入Vue,并安装路由
import Vue from 'vue'
import VueRouter from "vue-router"
Vue.user(VueRouter)
''添加路由配置
const router = new VueRouter({
//routes是数组,在里面配置路由
routes:[{
name:"index",
//设定路由参数,如果设定之后不传的话页面不会显示
path:"/index/:id",
//映射组件
component:()=>import('@/compoents/index.vue'),
//嵌套子路由
children:[
name:"index",
//子路由的路径不建议加'/',因为'/'开头的嵌套路径会被当做跟路由
path:"index",
//映射组件
component:()=>import('@/compoents/children.vue')
]
}]
})
------------------------------------------------
//在mian.js中
//引入路由
import router from "@/router"
new Vue({
//注入路由
router,
render: h => h(App),
}).$mount('#app'
//使用路由的组件中
//要使用router-view来设定展示路由的区域
<div id="app">
<p>展示路由的区域</p>
<router-view></router-view>
</div>
路由跳转
- 声明式导航
通过<v-link to="/index"></v-link>
来进行跳转
或者为超链接添加参数
<router-link to='/index/1'>跳转到参数1的页面</router-link>
- 编程式导航
使用方法$router.push()来进行跳转
//字符串
$router.push('index')
//对象
$router.push({name:'index'})//或者{path:'index'}
//命名的路由
$router.push({name:'index',params:{id:'1'})
//带查询参数的路由,地址会拼接成/index?id=1
$router.push({ path: 'index', query: { id: '1' }})
query需要path来引入,会拼接地址;params需要name来引入
const userId = '123'
router.push({ name: 'user', params: { userId }}) // -> /user/123
router.push({ path: `/user/${userId}` }) // -> /user/123
- 获取参数
this.$route.params
来获取params参数this.$route.query
来获取query参数
- 监听路由的变化
如果不同的路由指向的是同一个Vue组件,则即使路由跳转,vue的钩子函数也只会触发一次,因为原来的组件实例会被复用,则如果需要监听路由参数变化,需要用
watch:{
$router(to,from){
//to是目的路由参数
//from是上一个路由的参数
}
}
额外的查漏补缺:
- outline:none — CSS清除input框外边框阴影
- change:可以监听输入框的变化内容,但是要失去焦点并且值有变化的时候才会触发
- blur:失焦就会触发
- input:内容变化就会触发