@File
2019-10-11T12:55:29.000000Z
字数 6844
阅读 204
web
vue 官方文档
axios 官方文档
elementUi 官方文档
使用vue-cli能够快速的帮助我们构建项目,它就如同一个脚手架,提供了可选的模板。在使用vue-cli之前需要先安装nodejs。
# 安装vue-cli,该步骤需要等一段时间npm i -g @vue/cli# 查看vue-cli的版本vue -V# 创建名为my-app的项目vue create my-app
# 项目启动命令npm run serve
ctrl+c执行命令:
npm run build
将生成的dist目录下的文件放入到tomcat或者nginx下,启动服务器,即可访问。
和原始写法差不多,只是把一个页面再拆分成多块,然后拼接起来
<!-- html 内容 --><template></template><!-- js 代码块 --><script>// vue 代码块,类似 new Vue({})export default {}</script><!-- css 样式块 --><style></style>
js实现:
import...from引入文件components:注册组件
<script>// import <别名> from <路径>import HelloWorld from './components/HelloWorld.vue'// vue 代码块,类似 new Vue({})export default {// 注册后可以在 template 中调用components: {// 调用格式: <HelloWorld></HelloWorld>HelloWorld}}</script>
html实现:
<HelloWorld/>和<hello-world/>写法都可以
<template>// 把引入的 html 引用到这里<hello-world/></template>
父模块:
- 给子类传参
- 传字符串:
<参数名>="<字符串>"- 传属性::
<参数名>="<属性名>"- 传方法:
@<参数名>="<方法名>"- 取子类参数
- 声明取值:
ref="<取值属性命名>"- vue调用:
this.$refs.<取值属性>.<子类定义的属性名>
<template><!--传字符串:<参数名>="<字符串>"传属性::<参数名>="<属性名>"传方法:@<参数名>="<方法名>"声明赋值:ref="<取值属性命名>"--><hello-world str="传入字符串" :name="name" @setName="setName" ref="helloWorld"/></template><!-- js --><script>import HelloWorld from './components/HelloWorld.vue'export default {components: {HelloWorld},data() {// 设置属性return {name:'李大爷'}},methods: {// 设置方法setName(str) {this.name = str;// 配合 ref 直接获取 age 的参数this.age = this.$refs.helloWorld.age;}}}</script>
子模块:
props:中定义接收的参数this.$emit在自定义方法中调用父类方法
<template><input v-once v-model="str"><input v-model="name"></template><!-- js --><script>export default {// 接收父模块参数props: {// 参数名: 参数类型str: String,name: String,age: 18},methods: {// 创建一个方法setName(str){// 方法中调用父模块传来的方法this.$emit('setName', str);}}}</script>
npm i pubsub-js -S
// 引入import PubSub from 'pubsub-js'export default {methods: {pub() {// 调用 publish('频道','发布的内容') 发布PubSub.publish('channel1', '张某人');}}}
// 引入import PubSub from 'pubsub-js'export default {mounted() {// 调用 subscribe('频道',回调函数) 接收内容PubSub.subscribe('channel1', (key, value) => {// 订阅频道,channel1window.console.log(key);// 发布的内容window.console.log(value);});}}
<template><div><!-- 基本槽位 --><slot name="title"></slot><!-- 带属性的槽位 --><slot name="item" v-bind="person"></slot></div></template><!-- js --><script>export default {data() {return {person: {age: 10, name: 'zhangsan'}}}}</script>
<template><List><!-- v-slot 绑定 --><template v-slot:title><h2>插槽案例</h2><button class="btn btn-danger btn-sm">点击</button></template><!-- # 绑定,并取 props 参数 --><template #item="props"><h3>插槽属性</h3><p>属性值:{{props}}</p></template></List></template><!-- js --><script>// 引入带槽位的模块import List from './components/List.vue'export default {components: {List}}</script>
npm i axios vue-axios -S
新建Base.vue文件,文件内容如下:
<script>const BASE_URL = "http://localhost:8081"export default {BASE_URL}</script>
import axios from 'axios'import VueAxios from 'vue-axios'import Base from './Base.vue'// 顺序有关系Vue.use(VueAxios, axios);// 配置基本地址axios.defaults.baseURL = Base.BASE_URL;
请求方式:
get:this.axios.get('请求地址')
post:this.axios.post('请求地址',{请求参数})
delete:this.axios.delete('请求地址')
axios:this.axios({自定义请求属性})统一回调:
.then(成功回调,失败回调)
<script>export default {methods: {// post演示,举一反三post() {// 默认使用 json 格式提交参数this.axios.post('/addUser', {name:'李大爷', id: 10}).then(// 成功回调(resp) => {// resp.data 才是后端传过来的数据resp.data;},// 错误回调(error) => {});},// axios 自定义普通表单提交axios() {this.axios({url: '/addUser'method: 'post',data: {name: '李大爷',id: 10}}).then(// 成功回调(resp) => {},// 错误回调(error) => {})}}}</script>
npm i element-ui -S
import ElementUI from 'element-ui'import 'element-ui/lib/theme-chalk/index.css'Vue.use(ElementUI)
npm i vue-router -S
import Vue from 'vue'import Router from 'vue-router'const HOME = () => import('../views/Home');const ABOUT = () => import('../views/About');const HOME_INFO = () => import('../views/home/info');Vue.use(Router);export default new Router({mode: 'history',// 选中状态下默认添加的样式linkActiveClass: 'active',routes: [{path: '/home',component: HOME// 子路由children: [{// /:id 参数别名(非get提交(?id=2)时使用)path: '/home/info/:id'component: HOME_INFO,// 开启参数捕获(该属性get时默认false即可)props: true}]},{path: '/about',component: ABOUT_PATH},// 根路径默认会重定向到/about路径{path: '/',redirect: '/about'}]})
import Router from './router'new Vue({render: h => h(App),Router}).$mount('#app')
<!-- 一级路由节点 --><router-link to="/home">Home</router-link><router-link to="/about">About</router-link><!-- 路由页面展示节点 --><router-view></router-view>
<!-- 方式一 --><router-link :to="'/user/'+user.id">{{user.name}}</router-link><!-- 方式二 --><router-link :to="`/user/${user.id}`">{{user.name}}</router-link><!-- 方式三 --><router-link :to="{path:'/user', query:{id:user.id}}">{{user.name}}</router-link>
export default {// 方法一 和 方法二的取值props: {id: String}// 方法三 的取值mounted() {this.id = this.$route.query.id; //用户刷新的时候有用}}
this.$router.push({path: '/user',query: {id:id}});
this.$route.query.id;
import Router from './router'// 全局路由守卫Router.beforeEach((to,from,next) =>{// to: 当前的地址// from: 来源地址// next: 放行next();});
export default {// 渲染该组件的对应路由被 confirm 前调用beforeRouteEnter (to, from, next) {// 组件实例还没创建,this 无效},// 导航离开当前路由时调用beforeRouteLeave (to, from, next) {}}

npm i vuex -S
// index.js 基本格式import Vue from 'vue'import Vuex from 'vuex'Vue.use(Vuex);// 普通属性const state = {};// 根据state计算出来的属性const getters = {};// 修改state属性的方法const mutations = {};// 调用 mutations 方法const actions = {};export default new Vuex.Store({state,actions,getters,mutations});
import store from './store'new Vue({// 引入storestore,render: h => h(App)}).$mount("#app");
// 按需引入import {mapState, mapActions, mapGetters, mapMutations} from 'vuex'
methods: {test() {// 执行 mutations 中的 setTest 方法// 可行但不规范:this.$store.commit('setTest',10);// 执行 actions 中的 setTest 方法this.$store.dispatch('setTest',10);// 取 state 中的属性 testwindow.console.log(this.$store.state.test);// 取 getters 中的 testNumwindow.console.log(this.$store.getters.testNum);}}
computed: {// 引入属性...mapState(['test']),// 引入计算属性...mapGetters(['testNum'])},methods: {// 引入方法// 可行但不规范:...mapMutations(['setTest'])...mapActions(['setTest']),test() {// 调用 actions 中的 setTest 方法this.setTest(10);// 取 state 中的属性 testwindow.console.log(this.test);// 取 getters 中的 testNumwindow.console.log(this.testNum);}}
// store/demo/index.jsconst state = {};const getters = {};const mutations = {};const actions = {};export default ({state,actions,getters,mutations});
// index.js 基本格式import Vue from 'vue'import Vuex from 'vuex'// 引入 demo 模块import demo from './demo'Vue.use(Vuex);export default new Vuex.Store({// 引入 demo 模块modules: {demo}});
getters、actions、mutations都被注册到全局上,和之前的调用方式一样。
// 导入式调用...mapState({test: state => state.demo.test});// 直接调用this.$store.state.demo.test;