我是A组件
{{data.obj.lastName}}目录
Mock
swiper
seiper的基本使用
swiper在vue中的问题
组件通讯的方式
props 父给子通讯
自定义事件 子给父通讯
父组件通过ref获取子组件数据
全局事件总线 $bus 全能
作用域插槽
vuex
$parent 和 $children
sessionStorage,localStorage传值
路由传参
params
query
总结
Mock.jshttp://mockjs.com/
//引入数据 webpack默认对外暴露:图片 json
import banner from './banner'
import floors from './floors'
//mock数据 第一个参数为请求地址,第二个为请求数据
Mock.mock('/mock/banner', { code: 200, data: banner })
Mock.mock('/mock/floors', { code: 200, data: floors })
import Swiper from "swiper";
import 'swiper/css/swiper.css'
//swipers实例之前结构必须要有
//第一个参数:可以是字符串也可以dom节点
var mySwiper = new Swiper ('.swiper-container', {
loop: true, // 循环模式选项
// 如果需要分页器
pagination: {
el: '.swiper-pagination',
clickable: true, //点击小球切换
},
// 如果需要前进后退按钮
navigation: {
nextEl: '.swiper-button-next',
prevEl: '.swiper-button-prev',
},
// 如果需要滚动条
scrollbar: {
el: '.swiper-scrollbar',
},
})
swpier实例 如果存在异步请求结构还不完整不能在mounted生成swiper实例
使用watch监听加nextTick解决
watch监听数据的变化,然后拿到最新dom
Vue.nextTick 在下次dom更新循环结束之后 执行延迟回调在修改数据之后获取更新后的dom
父组件
子组件 props: ['msg'],
父组件 在子组件标签上使用 @自定义事件名=‘父组件里面的方法名’
子组件 内容通过事件触发 使用 this.$emit(‘自定义事件名’,‘值’)传递数据
1.直接放在标签中获取元素节点
2.放在组件中获取组件对象
alert(this.$refs.r1.msg)
安装
npm install vue-bus
引入
import Vue from "vue";
import VueBus from "vue-bus";
Vue.use(VueBus);
发送变化的数据 this.$bus.emit("select-item", data);
$bus.on实时监听数据,数据有变化则会自动执行一次
mounted() {
this.$bus.on("select-item", (data) => {
console.log("select-item", data);
this.activeName = data;
});
}
有时让插槽内容能够访问子组件中才有的数据是很有用的。现在,假设B组件:
我是B组件
{{obj.firstName}}
接收
我是A组件
{{data.obj.lastName}}
ElementUI里面的表格el-table,当改变某一列展示的字段时,我们经常使用:
{{scope.row.xxx}}
state中定义数据 CategoryList: [],
mutations修改state数据(同步) commit 执行
CategoryList(state, payload) {
state.CategoryList = payload
},
actions(异步) 通知mutations修改数据 dispatch执行
async AstncCategoryList({ commit }) {
let { data, code } = await axios.CategoryList();
if (code !== 200) return
commit('CategoryList', data)
},
this.$store.dispatch("AstncCategoryList");
页面获取数据...mapState辅助函数computed映射
import { mapState } from "vuex";
computed: {
...mapState({
FloorList: (state) => state.home.FloorList,
}),
},
ref为子组件指定一个索引名称,通过索引来操作子组件;
this. $parent可以直接访问该组件的父实例或组件;
父组件也可以通过this.$children 访问它所有的子组件; 需要注意 $children 并不保证顺序,也不是响应式的。
LocalStorage或SessionStorage通常以键/值对形式的字符串进行存储,所以在存储时需要对数据格式进行转换,使用JSON.stringify方法将对象转换成字符串,提取时用JSON.parse方法将字符串转换成对象
提供了5个方法,分别是clear(清除LocalStorage)、getItem(获取本地数据)、key(取下标对应键的值)、removeItem(删除以保存数据)、setItem(设置保存数据)。
sessionStorage 的生命周期是在浏览器关闭前。也就是说,在整个浏览器未关闭前,其数据一直都是存在的。
localStorage的生命周期是永久性的。假若使用localStorage存储数据,即使关闭浏览器,也不会让数据消失
localStorage.setItem("localStorage",JSON.stringify(obj))
this.localStorage=JSON.parse(localStorage.getItem('localStorage'))
sessionStorage.setItem("sessionStorage",JSON.stringify(obj2))
this.sessionStorage=JSON.parse(sessionStorage.getItem("sessionStorage"))
router-link形式传参【在路径中显示参数,刷新页面参数不丢失】、
//配置路由
path:'/path/:id'
//传递方式,在path后面跟上对应的值
//获取参数
$route.params.id
//传递后形成的路径,刷新页面,参数不丢失
/path/id值
编程式导航形式传参,通过path匹配路由【在路径中显示参数,刷新页面参数不丢失】
//配置路由
path:'/path/:id'
//传递方式,通过path匹配路由,且在path后面跟上对应的值
this.$router.push({
path: `/path/${id}`
})
//获取参数
$route.params.id
//传递后形成的路径,刷新页面,参数不丢失
/path/id值
编程式导航形式传参,通过name匹配路由【不在路径中显示参数,刷新页面参数丢失】
//传递方式,通过name匹配路由
this.$router.push({
name: "name", //路由配置中的name
params:{
id:222
}
});
//获取参数
$route.query.name
//传递后形成的路径,刷新页面,参数丢失
/path
router-link形式传参【在路径中 ?后面显示参数,刷新页面参数不丢失】
//传递方式
//或者
//获取参数
$route.query.name
//传递后形成的路径,刷新页面,参数不丢失
/path?id=123
编程式导航形式传参,通过path匹配路由【在路径中 ?后面显示参数,刷新页面参数不丢失】
this.$router.push({
path:'/path',
query: {
id:'123'
}
})
//获取参数
$route.query.name
//传递后形成的路径,刷新页面,参数不丢失
/path?id=123
编程式导航形式传参,通过name匹配路由【在路径中 ?后面显示参数,刷新页面参数不丢失】
//传递方式,通过name匹配路由
this.$router.push({
name:'name',//路由配置中的name
query: {
id:'123'
}
})
//获取参数
$route.query.name
//传递后形成的路径,刷新页面,参数不丢失
/path?id=123
query和params分别都有三种形式可以传参:
router-link形式
通过path匹配路由的编程式导航形式
通过name匹配路由的编程式导航形式
而这其中只有params方式 的 通过name匹配路由的编程式导航形式 不会在路径中带有参数(且刷新页面参数丢失),其他都会带有参数值(刷新页面参数不丢失)
全局引入 注册使用
import Carsouel from './components/Carsouel/Carsouel.vue'
Vue.component(Carsouel.name, Carsouel)