axios
npm i axios
跨域问题,协议名+ip+端口号。
实际上,浏览器是收到数据的,但是没有交付给开发者。
创建代理服务器。代理服务器和前端端口是一样的,所以不存在跨域问题。代理服务器与后端服务器都是服务器,和浏览器没有关系,使用http协议传输数据,所以数据能正常交付给代理服务器。
1、如何创建代理服务器
nginx
2、借助vue-cli
配置参考 | Vue CLI
module.exports = { devServer: { proxy: 'http://localhost:4000' } }
public文件夹下边有的,都算是8080服务器有的。可以直接请求访问。如果public下边有,则不用访问后端服务器,可以直接去public下边有的。
3、配置多个代理服务器
module.exports = { devServer: { proxy: { '/api': { target: '', ws: true, changeOrigin: true }, '/foo': { target: ' ' } } } }
main.js注册全局总线
beforeCreate(){ Vue.prototype.$bus = this }
List.vue 【收数据】
mounted(){ this.$bus.on('userList',(users)=>{ console.log('我是List组件,收到了数据',users) }) }
Search.vue 【传递数据】
this.$bus.$emit('userList',response.data.items)
展示数据
1、默认欢迎页面
2、loading页面
3、成功返回页面
4、失败返回页面
data(){ return{ isFirst:true,//是否初次展示 users:[], isLoading:false,//是否加载中 errMsg:'',//错误信息 } }欢迎使用!
加载中!
{{errMsg}}
Search.vue
searchUsers(){ this.$bus.$emit('userList',{isFirst:false,isLoading:true,errMsg:'',users:[]}); axios.get(`https://api.github.com/search/users?q=${this.keyWord}`).then( response=>{ this.$bus.$emit('userList',{isLoading:false,errMsg:'',users:response.data.items}) }, error=>{ this.$bus.$emit('userList',{isLoading:false,errMsg:error.message,users:[]}) } ) }
List.vue
mounted(){ this.$bus.on('userList',(userObj)=>{ console.log('我是List组件,收到了数据',userObj) this.info = {...this.info,...userObj} }) }
插槽:就是告诉vue,在双闭合标签内部,要插入的内容的位置。
category.vue
{{title}}
我是一个默认值,当外围组件没有传递数据,我会出现
App.vue
{{g}}
存放位置:我是一个默认值,当外围组件没有传递数据,我会出现 外围: 外围:xxxxxxxxxxx作用域插槽
数据在插槽里边,外围想要使用
我是一个默认值,当外围组件没有传递数据,我会出现 外围:
- {{g}}
Vuex
npm i vuex@3
Vue.use(Vuex)
store
vc要看到store
store/index.js
import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) const actions = {} const mutations = {} const state = { sum:0 } export default new Vuex.Store({ actions, mutations, state })main.js
import Vue from 'vue' import App from './App.vue' import store from './store/index' Vue.config.productionTip = false const vm = new Vue({ render: h => h(App), store:store, beforeCreate(){ Vue.prototype.$bus = this }, }).$mount('#app') console.log('vm',vm);methods:{ increment(){ this.$store.dispatch('jia',this.n) } }import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) const actions = { jia:function (context,value) { context.commit('JIA',value) } } const mutations = { JIA(state,value){ state.sum += value } } const state = { sum:0 } export default new Vuex.Store({ actions, mutations, state })action中的上下文中有什么
commit:流向Mutation
dispatch:继续再action里边处理事情 context.dispatch('demo1',value1) demo1方法处理完了之后,context.commit('xxx',value2);
getters
rootGetters
rootState
state:如果在上下文中直接修改state的值,那么vue-detTools就不能够捕获,vuex的数据流向了。
可以跳过dispatch
this.$store.commit('JIA',this.number)getters的作用
用于将state中的 数据进行加工,方便所有VC使用。computed仅仅在一个组件中使用
const getters = { bigSum(state){ return state.sum * 10 } } export { getters, } this.$store.getters.bigSumvuex代码优化
this.$store.state.xxx很麻烦,可以借助计算属性 computed:{ sum(){ return this.xxxxxxxxxx } } 这样写也很麻烦优化点,引入vuex
import {mapState} from 'vuex' mounted(){ const x = mapState({ he:'sum', xuexiao:'school', xueke:'sunbject' }); console.log(x) 可以看出x是一个对象,将其对象通过...加入到computed里边 } computed:{ ...mapState({ xxxxxxxxxxxxx }) ...mapGetters(['xxx','xxxxx']) ...mapGetters("common", ["bbbbbbbbbb"]), }, methods:{ ...mapActions("common",['xxxxxxxxxxxx]), ...mapMutations("common",['aaaaaaaaaa']), }Vuex模块化
store/index.js
const countOptions = { namespaced:true, actions:{ } } const personOptions = { namespaced:true, actions:{ } } export default new Vuex.Store({ modules:{ countOptions, personOptions, } }) ...mapState('countOptions',['xxx','xxxxxxx']) //或者是 this.$store.commit('personOptions/ADD_PERSON',personObj);