赞
踩
初始化项目:vue create 项目名称
脚手架目录:public + assets文件夹区别
node_modules:
放置项目依赖的地方
public:
一般放置一些共用的静态资源(图片),webpack
打包的时候,public文件夹
里面资源原封不动打包到dist文件夹里面
src:
程序员源代码文件夹的
assets文件夹
经常放置一些静态资源(一般放置多个组件公用的静态资源),assets文件夹
里面的静态资源,webpack
会把静态资源当作一个模块,打包到JS文件夹
里面
components文件夹
一般放置非路由组件(或者项目共用的组件-全局组件)
App.vue
唯一的根组件
main.js
入口文件【程序最先执行的文件】
babel.config.js:babel
配置文件
package.json
项目描述、项目依赖、项目运行指令,项目的身份证
package-lock.json
缓存性文件
README.md
项目说明文件,依赖是哪里来的都给你记录了
"serve": "vue-cli-service serve"
,后面加上--open
注意:要进去
app文件
里面去CMD
启动项目npm run serve
错误的话要再加一句:
"serve": "vue-cli-service serve --open --host=localhost"
在package.json文件中
"scripts": {
"serve": "vue-cli-service serve --open",
"build": "vue-cli-service build",
"lint": "vue-cli-service lint"
},
eslint
校验工具创建vue.config.js文件:需要对外暴露
module.exports = {
lintOnSave:false,
}
src
文件夹的别名的设置因为项目大的时候
src
(源代码文件夹):里面目录会很多,找文件不方便,设置src
文件夹的别名的好处,找文件会方便一些
创建jsconfig.json
文件(5.12—09.29现在vue
项目初始化的时候就有@
了)
{
"compilerOptions": {
"baseUrl": "./",
"paths": {
"@/*": [
"src/*"
]
}
},
"exclude": [
"node_modules",
"dist"
]
}
vue-router
前端所谓路由:Key-Value
键值对
K
即为URL(网络资源定位符)
V
即为相应的路由组件
确定项目结构顺序:上中下
跳转的时候只有中间部分的V在发生变化,所以中间部分应该使用的是路由组件
由2个非路由组件|四个路由组件组成:
本次项目主要以业务和逻辑为主,不写html
和css
了
项目开发的时候:
注意点:
组件结构
+ 组件样式
+ 图片资源
(意思就是将静态页面copy过来的时候一部分一部分来)less
样式,但是浏览器不识别,所以需要通过安装less
、less-loader
进行处理,注意安装版本,此处安装的是npm i less-loader@6
less
样式,需要在style
标签上添加lang="less"
第一步:创建或定义
第二步:引入
第三步:注册
第四步:使用
注意清除默认的样式
css文件
,放在public文件夹
下,记得引入还有记得把
app.vue
里面的样式给他删除了!!!!!
给你 html
和 less
和资源图片文件时
index.vue
html
和less
结构分别放入template
和style
中,其中style
记得写上 lang="less"
images
,然后找到html
中所需要的,放进去app.vue
中引入组件,注册组件,使用组件安装 vue-router
注意安装@3
版本
路由组件有四个:Home
、Search
、Login
、Register
components文件夹
经常存放的是非路由组件(共用全局组件)
pages/views文件夹
经常存放路由组件
项目当中配置的路由一般放在router文件夹中
router文件夹
中创建index.js文件
需要引入Vue
和VueRouter
然后暴露路由实例,然后里面配置对象(路由)----就是写一个个对象,里面是path和component
之后将要暴露的路由组件引入–对象中需要告诉路径path
和组件component
之后需要路由文件执行一次,路由文件需要在入口文件main.js
中注册
//引入路由
import router from '@/router'
new Vue({
render: h => h(App),
//注册路由
router
}).$mount('#app')
注册完还看不见,需要在app.vue
中展示
Vue中借助router-link标签实现路由的切换----目前这个用不到
<router-link to="/about">About</router-link>
以及指定位置展示----需要
<router-view></router-view>
路由组件与非路由组件的区别
pages
或views
中,非路由组件放在components
中router
文件夹中进行注册(使用的即为组件的名字component: SearchYu
)、非路由组件在使用的时候,一般都以标签的形式使用(重要!!!! //注册路由信息:写下下面这句的时候,组件身上都会拥有$route,$router属性
router
还需要在路由中,重定向,在项目运行时,访问/,立马定位到首页
{
path: "*",
redirect: "/home"
}
$route
:一般获取路由信息【路径、query
、params
等】
$router
:一般进行编程式导航进行路由跳转【push
、replace
】
路由的跳转就两种形式:
声明式导航router-link
和编程式导航push | replace
都可以进行路由跳转
编程式导航更好用:编程式导航除了路由跳转,还可以在路由跳转之前做一些其他的业务逻辑
修改登入和注册跳转
在修改Header组件中的跳转
<!-- 声明式导航,需要to属性,告诉他往哪里跳 该有的样式不要丢了-->
<router-link to="/login">登入</router-link>
<router-link to="/register" class="register">免费注册</router-link>
同理,点击头部的企业图片是往主页跳转
<router-link class="logo" title="尚品汇" to="/home" target="_blank">
<img src="./images/logo.png" alt="" />
</router-link>
同理,点击头部的搜索按钮也要跳转----注意这个是按钮,将来要收集文本框里用户的输入信息----用编程式导航
@click="goSearch"
<button class="sui-btn btn-xlarge btn-danger" type="button" @click="goSearch">搜索</button>
methods中配置相应回调
goSearch() {
this.$router.push("/search");
},
显示和隐藏组件:v-if
或v-show
FooterYu
组件:在主页和搜索页显示,在登入和注册页隐藏
面试题:
v-show
与v-if
区别
v-show
:通过样式display控制
v-if
:通过元素上树与下树进行操作,操作DOM,效率低
我们可以根据组件身上的$route
获取当前路由的信息,通过路由路径判断是否显示或隐藏
<Footer v-show="$route.path == '/home' || $route.path == '/search'" /> 优化写法----路由元信息----在配置路由的时候自己定义一些属性(show)在meta对象中 routes: [ { path: "/home", component: Home, meta: { show: true } }, { path: "/login", component: Login, meta: { show: false } }, ...都要配置meta... ] 然后直接判断$route中的属性 <Footer v-show="$route.meta.show" />
配置路由的时候,可以给路由添加路由元信息meta
,路由需要配置对象,meta
是规定的,我们不能随意添加想要的key
,这是不行的
声明式导航router-link
和编程式导航push | replace
都可以进行路由跳转(需要指定 to
去哪里 写路由路径)
编程式导航更好用:编程式导航除了路由跳转,还可以在路由跳转之前做一些其他的业务逻辑
params
参数:路由需要占位,属于URL
当中一部分
query
参数:路由不需要占位,写法类似于ajax
当中query
参数/home?k=v&k=v,
获取搜索框中的用户输入信息,用v-model
data中配置keyword用来收集
data() {
return {
keyword: "",
};
},
<input
type="text"
id="autocomplete"
class="input-error input-xxlarge"
v-model="keyword"
/>
这是在编程式路由导航中的写法,params
和query
都有以上这三种写法
点击搜索的时候要接受路由传递过来的参数,params
和query
参数都要,params
需要占位----在路由中写好
就是将搜索框中的参数用params
和query
传给搜索组件
字符串写法
小写是parans参数,大写是query参数(带问号的键值对形式
this.$router.push("/search/" + this.keyword + "?k=" + this.keyword.toUpperCase());
这样子search组件就可以拿到params和query参数,可以在search中展示一下----取出来展示一下,在$route中
<h1>params参数{{ $route.params.keyword }}</h1>
<h1>query参数{{ $route.query.k }}</h1>
模板字符串写法
this.$router.push(`/search/${this.keyword}?k=${this.keyword.toUpperCase()}`);
对象写法
注意:如果是对象写法,而且是路由跳转传参,传的还是params参数,那就需要给我们的路由命名
在路由配置文件中,给search路由起个名字
name: "search"
this.$router.push({
name: "search",
params: {
keyword: this.keyword,
},
query: {
k: this.keyword.toUpperCase(),
},
});
总结流程:在头部Header组件
中可以用v-model
拿到用户的输入keyword
,然后通过三种方式(字符串,模板字符串,对象写法)给search组件
传递收集来的keyword
,然后search组件
就可以展示了(在$route
中可以读取到)
路由传递参数(对象写法)
path
是否可以结合params
参数一起使用?
不可以,不能进行路由的跳转。对象的写法可以是name
或者path
,但是path
写法不能与params
参数一起使用,params
需要与name
搭配
如何指定
params
参数可传可不传
比如:配置路由的时候,占位了(params
参数),但是路由跳转的时候我就故意不传递值
会导致路径地址中连search
都没有:
http://localhost:8080/#/?k=QWE
http://localhost:8080/#/search?k=QWE
(至少应该要有search,但是不传递的话,连search都没有)
指定params
可传可不传的时候,可以在路由占位的时候,加上?
,代表将来传或者不传都可以
{
path: "/search/:keyword?",
component: Search,
meta: { show: true },
name: "search"
},
params
参数可以传递也可以不传递,但是如果传递的是空串,该怎么解决
传递空串的话,会出现路径当中少了search
使用undefined
解决:{ name: 'search', params: { keyword: ' ' || undefined }, query: {...} }
一个小技巧
路由组件能不能传递
props
数据
可以的,有三种写法
路由的props
配置----意思就是在配置路由(index.js
)的时候写上props
第一种:布尔值方式 注意只能传递params参数 在配置路由的时候加上 { props: true } 同时在组件中用 props: ['keyword'] 接收,组件中的模板就可以直接使用参数了{{ keyword }},不用写$route.params.XXX 相当于一个开关,true就可以接受到了。Header中该传的还得传:this.$router.push("/search/" + this.keyword); 第二种:对象写法 额外给路由组件传递一些props props: { a: 1, b: 2 } 第三种:函数写法 可以params参数和query参数,通过props传递给路由组件,最常用----可以写一般写法props($route){} props: ($route) => { return { keyword: $route.params.keyword, k: $route.query.k } } 如果用props来传参数的话,就是说先把参数传到路由组件身上去,用的时候就不用在$route里面去取了----直接用{{ keyword }} 获取路由参数就是为了组件获取参数方便一些,上面模板的写法简单一点;路由那边(路由配置index.js文件中的函数写法)处理好了,组件拿的时候更方便一些
今天犯错的几个点:
App
组件的模板中忘记加一个最外层的div
App
组件中注册其他组件时,把components
因为自动输入写成commits
没有发现,导致引入失败
ES6
模板字符串的写法
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。