// 子组件监听
watch: {
getSelect(obj) {
// console.log(obj)
this.$emit('select', obj)
},
// 监听数据变化
schedule(val){
this.parentSchedule = val;
},
// 将监听到的数据变化,传到父组件
parentSchedule(val) {
this.$emit('changeSchedule', val);
}
},
// 父组件
// 获取可预定日期时间
_getModelVisitorTime(){
api.getModelOrder({
model_id:this.$route.params.id,
}).then(res=>{
var obj = {}
var data = res.data
for(var i in data){
var dateArr = data[i].days.split(' ')[0]
var times = data[i].times.split('#')
obj[dateArr] = times;
}
// this.$set(this.schedule,obj)
this.schedule = obj
// console.log(this.schedule)
// console.log("getMOdelVisitor");
// console.log(this.$refs.timeSelect.getTimeList(obj))
})
},
//
changeSchedule(val){
this.schedule = val;
},
复制代码
// 将字符串转换成datetime格式
_getDateTime(dateTimeStr){
var date = new Date(dateTimeStr).getDate()
var month = new Date(dateTimeStr).getMonth()+1
var Year = new Date(dateTimeStr).getFullYear()
var datetime = Year + '-' + month +'-' + date + ' ' + '00:00:00.000000'
return datetime
},
复制代码
// 获取可预定日期时间
_getModelVisitorTime(){
var that = this;
api.getModelOrder({
model_id:this.$route.params.id,
}).then(res=>{
console.log(res)
var obj = {}
var data = res.data
for(var i in data){
var dateArr = data[i].days.split(' ')[0]
var times = data[i].times.split('#')
obj[dateArr] = times;
}
this.schedule = obj
console.log(this.schedule)
console.log("getMOdelVisitor");
console.log(this.$refs.timeSelect.getTimeList(obj))
})
},
复制代码
为何git每次git push 的时候要重复的输入用户名javascript
[winUpdater]
recentlySeenVersion = 2.18.0.windows.1
[filter "lfs"]
clean = git-lfs clean -- %f
smudge = git-lfs smudge -- %f
process = git-lfs filter-process
required = true
[user]
email = m13425477079@163.com
name = kennana
//.gitconfig 添加一下配置
[credential]
helper = store
复制代码
查询状态 git statusphp
添加到本地仓库 git add . 添加全部文件,可是这样有点粗暴,咱们修改了那个文件就能够 git add src/api/api.jscss
而后就是添加注释,你最近解决了什么问题 git commit -m"解决了问题的注释"html
更新到码云,github上面去,git push前端
更新到本地,就能够是 git pullvue
最近在自学vue,照着网上例子写了一个父子组件的双向绑定,只实现了单向绑定。父组件的数据不能随子组件变化,只能是子组件数据随父组件变化;在官网看了文档一时仍是没法理解其思路。 请各位前辈帮忙看看是哪里出的问题,谢谢html5
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>双向绑定</title>
<script src="https://cdn.jsdelivr.net/npm/vue "></script>
</head>
<body>
<div id="app">
<div>
<span>父:{{value}}</span>
<input type="text" v-model='value' v-on:click="c_lick">
</div>
<my-com v-model="value"></my-com>
</div>
<template id="template1">
<div>
<span>子:{{childvalue}}</span>
<input type="text" v-model='childvalue' v-on:click="f_click">
</div>
</template>
<script>
new Vue({
el: '#app',
data: {
value: ''
},
methods: {
c_lick() {
//this.value--;
}
},
components: {
'my-com': {
template: '#template1',
props: ['value'],
data: function () {
return {
childvalue: this.value
}
},
methods: {
f_click() {
//this.currentvalue++;
this.$emit('input', this.childvalue);
}
},
watch: {
value(val) {
this.childvalue = val;
}
}
}
}
})
</script>
</body>
</html>
复制代码
vue双向绑定,首先来讲要搞懂单向传递的原理,逐渐深刻。父传子用props,子传父用emit('属性名',传的值)来传给父级,而父级须要用一个v-on来接收这个值。 下述为双向传递,我本身写了一篇笔记,分享给你,对你学习vue颇有帮助,好好研读java
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>baidu</title>
<script type="text/javascript" src="js/vue.js"></script>
</head>
<body>
<div id="app">
<switchbtn :result="result" @on-result-change="onResultChange"></switchbtn>
<input type="button" value="change" @click="change">
</div>
</body>
<script type="text/javascript">
Vue.component("switchbtn", {
template: "<div @click='change'>{{myResult?'开':'关'}}</div>",
props: ["result"],
data: function () {
return {
myResult: this.result//①建立props属性result的副本--myResult
}
},
watch: {
/* 此处是重点 */
result(val) {
this.myResult = val;//②监听外部对props属性result的变动,并同步到组件内的data属性myResult中
},
myResult(val){
this.$emit("on-result-change",val);//③组件内对myResult变动后向外部发送事件通知
}
},
methods: {
change() {
this.myResult = !this.myResult;
}
}
});
new Vue({
el: "#app",
data: {
result: true
},
methods: {
// 外部触发方法
change() {
this.result = !this.result;
},
// 接收
onResultChange(val){
this.result=val;//④外层调用组件方注册变动方法,将组件内的数据变动,同步到组件外的数据状态中
}
}
});
</script>
</html>
复制代码
配置环境前下好language-pack-en-base这个包,解决不一样语言之间可能发生的冲突,-y参数的意思是直接安装无需确认
sudo apt-get update
sudo apt-get install -y language-pack-en-base
安装完成后运行locale-gen en_US.UTF-8
再在服务器上安装Git sudo apt-get install git
sudo apt-get install software-properties-common python-software-properties
sudo add-apt-repository ppa:ondrej/php && sudo apt-get update
sudo apt-get -y install php7.2
# 若是以前有其余版本PHP,在这边禁用掉
sudo a2dismod php5
sudo a2enmod php7.2
# 安装经常使用扩展
sudo -y apt-get install php7.2-fpm php7.2-mysql php7.2-curl php7.2-json php7.2-mbstring php7.2-xml php7.2-intl
# 安装其余扩展(按需安装)
sudo apt-get install php7.2-gd
sudo apt-get install php7.2-soap
sudo apt-get install php7.2-gmp
sudo apt-get install php7.2-odbc
sudo apt-get install php7.2-pspell
sudo apt-get install php7.2-bcmath
sudo apt-get install php7.2-enchant
sudo apt-get install php7.2-imap
sudo apt-get install php7.2-ldap
sudo apt-get install php7.2-opcache
sudo apt-get install php7.2-readline
sudo apt-get install php7.2-sqlite3
sudo apt-get install php7.2-xmlrpc
sudo apt-get install php7.2-bz2
sudo apt-get install php7.2-interbase
sudo apt-get install php7.2-pgsql
sudo apt-get install php7.2-recode
sudo apt-get install php7.2-sybase
sudo apt-get install php7.2-xsl
sudo apt-get install php7.2-cgi
sudo apt-get install php7.2-dba
sudo apt-get install php7.2-phpdbg
sudo apt-get install php7.2-snmp
sudo apt-get install php7.2-tidy
sudo apt-get install php7.2-zip
复制代码
成功后运行php -v查看版本,应显示相似信息 PHP 7.2.12-1+ubuntu14.04.1+deb.sury.org+1 (cli) (built: Nov 12 2018 10:58:25) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies with Zend OPcache v7.2.12-1+ubuntu14.04.1+deb.sury.org+1, Copyright (c) 1999-2018, by Zend Technologies
node
安装mysqlpython
sudo apt-get install mysql-server mysql-client过程当中输入密码,肯定后安装完成。
mysql -u root -p再输入密码测试,能成功登录即安装完成。exit退出mysql
由于上线的应用为laravel 5.5版本开发的,为了以后的兼容性问题,ubuntu14.04直接安装的mysql不是较新版本,所以要升级一下mysql:
cd ~
wget https://dev.mysql.com/get/mysql-apt-config_0.8.1-1_all.deb
sudo dpkg -i mysql-apt-config_0.8.1-1_all.deb
解压安装包后会弹出框,选择好mysql 5.7版本后选择ok 而后继续
而后,更新包索引:sudo apt-get update
而后,安装MySQL-server:sudo apt-get install mysql-server
而后,升级所有的Mysql数据库:sudo mysql_upgrade -u root -p
最后,重启mysql server:sudo service mysql restart
登录一下mysql看看是否已经升级完毕,成功了进入下一步
mysql -uroot -p密码
复制代码
因为apache2指向的网站根目录是/var/www/html/,要修改配置文件000-default.conf
vim /etc/apache2/sites-enabled/000-default.conf
使网站根目录指向 /var/www/html/public/
而后再修改/etc/apache2/apache2.conf的这里
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
将AllowOverride None 的None改成All.保存重启apache2
这时访问网址,若是出现500错误.那就是因为storage目录没有 777 权限。
到/var/www/html/目录 执行
chmod -R 777 storage
复制代码
在Unbuntu中重启Apache服务器出现错误:AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1.等等。解决方法:
$ sudo vim /etc/apache2/apache2.conf
最后加入一句: ServerName localhost:80
复制代码
sudo apache2ctl -k restart
submit() {
// 提交数据,user_id,manager_id,days,times;
var days_times = this.dateSelect;
if (!days_times) {
// 若是没有选择就不提交了
return;
}
for (let val in days_times) {
// 以#号传字段
var str = "";
var arr = days_times[val];
// 减小for循环的嵌套
for (let i = 0; i < arr.length; i++) {
str += arr[i];
str += "#";
}
var newstr = str.substring(0, str.length - 1);
// console.log(newstr);
api.userOrder({
user_id: localStorage.getItem("user_id"),
model_id: this.$route.params.id,
days: val,
times: newstr
}).then(res => {
console.log(res);
if (res.code === 1) {
// 成功
MessageBox({
title: "",
message: res.msg,
showCancelButton: false
});
}
}).catch(e => {
// 失败
if (e.code === 0) {
MessageBox({
title: "",
message: e.msg,
showCancelButton: false
});
}
});
}
},
复制代码
咱们在更新数据属性时覆盖了咱们对DOM所作的更改。这样作的缘由是,当访问DOM元素并直接操做它们时,实际上跳过了前面文章中讨论到的虚拟DOM。所以,Vue仍然控制着h1元素,甚至当Vue对数据中的作出更新时,它会更新虚拟DOM,而后更新DOM自己。所以,你应该当心使用对DOM的直接更改,就算是你不当心作了相应的修改,你所作的任何更改都将可能会被覆盖。虽然在使用refs时应该当心更改DOM,可是作只读操做相对来讲比较安全,好比从DOM中读取值。
<div id="app">
<h1>{{ message }}</h1>
<button ref='myButton' @click="clickedButton">点击偶</button>
<ul>
<li v-for="todo in todos" ref='todos'>
{{ todo.text }}
</li>
</ul>
</div>
复制代码
下面这种状况是渲染不出来的
<div id="app">
<h1>{{ message }}</h1>
<button ref='myButton' @click="clickedButton">点击偶</button>
</div>
<ul>
<li v-for="todo in todos" ref='todos'>
{{ todo.text }}
</li>
</ul>
复制代码
fileChange(e) {
let file = e.target.files[0];
if (file.size > this.maxSize) {
MessageBox("提示", "图片太大了噢");
} else {
let formData = new FormData();
formData.append("img", file);
api.upload(formData).then(res => {
console.log(res);
if (res.host) {
this.icon = res.host + res.path;
} else {
this.icon = res.path;
}
this.$emit("changeIcon",res.path);
})
}
},
changeName() {
MessageBox.prompt("输入昵称", "")
.then(({ value, action }) => {
if (!value) {
return;
}
this.name = value;
//
this.$emit('changeName',this.name);
})
.catch(() => {});
},
changePhone() {
MessageBox.prompt("输入联系方式", "")
.then(({ value, action }) => {
if (!value) {
return;
}
this.phone = value;
this.$emit("changePhone",this.phone);
})
.catch(() => {});
},
复制代码
<mt-button
v-if="icon"
class="right-icon"
// @click.native="$emit('right-click')"
// 跟原生的onclick="change()"同样的形式,能够不用this
@click.native="$emit('right-click')">
<img
:src="icon"
height="20"
width="20"
slot="icon">
{{ right }}
</mt-button>
复制代码
segmentfault.com/q/101000001… www.jb51.net/article/117… blog.csdn.net/qq_39894133…
一:时间转时间戳:javascript得到时间戳的方法有四种,都是经过实例化时间对象 new Date() 来进一步获取当前的时间戳
1.var timestamp1 = Date.parse(new Date()); // 结果:1477808630000 不推荐这种办法,毫秒级别的数值被转化为000
console.log(timestamp1);
2.var timestamp2 = (new Date()).valueOf(); // 结果:1477808630404 经过valueOf()函数返回指定对象的原始值得到准确的时间戳值
console.log(timestamp2);
3.var timestamp3 = new Date().getTime(); // 结果:1477808630404 ,经过原型方法直接得到当前时间的毫秒值,准确
console.log(timestamp3);
4.var timetamp4 = Number(new Date()) ; //结果:1477808630404 ,将时间转化为一个number类型的数值,即时间戳
console.log(timetamp4);
二,时间戳转时间
var timestamp4 = new Date(1472048779952);//直接用 new Date(时间戳) 格式转化得到当前时间
console.log(timestamp4);
console.log(timestamp4.toLocaleDateString().replace(/\//g, "-") + " " + timestamp4.toTimeString().substr(0, 8)); //再利用拼接正则等手段转化为yyyy-MM-dd hh:mm:ss 格式
复制代码
for(var i in days_times){
// 选中多少个就给他发送多少个请求
days = this._getDateTime(i)
console.log("days",days)
times = days_times[i].join("#")
console.log("times",times)
api.userOrder({
user_id: localStorage.getItem('user_id'),
model_id: this.$route.params.id,
days: days,
times: times
}).then(res=>{
console.log("submit",res)
if(res.code===1){
// 成功
MessageBox({
title:'',
message: res.msg,
showCancelButton: false
});
}
}).catch(e=>{
// 失败
if(e.code===0){
MessageBox({
title:'',
message: e.msg,
showCancelButton: false
});
}
})
}
复制代码
<TimeSelect ref="timeSelect" v-if="schedule" :schedule="schedule" @select="select"/>
可能由于在异步加载时须要判断一下那个schedule是否为空,
复制代码
父beforeCreate->父created->父beforeMount->子beforeCreate->子created->子beforeMount->子mounted->父mounted
父beforeUpdate->子beforeUpdate->子updated->父updated
复制代码
父beforeUpdate->父updated
复制代码
父beforeDestroy->子beforeDestroy->子destroyed->父destroyed
复制代码
created:在模板渲染成html前调用,即一般初始化某些属性值,而后再渲染成视图。
mounted:在模板渲染成html后调用,一般是初始化页面完成后,再对html的dom节点进行一些须要的操做
其实二者比较好理解,一般created使用的次数多,而mounted一般是在一些插件的使用或者组件的使用中进行操做,好比插件chart.js的使用: var ctx = document.getElementById(ID);一般会有这一步,而若是你写入组件中,你会发如今created中没法对chart进行一些初始化配置,必定要等这个html渲染完后才能够进行,那么mounted就是不二之选。下面看一个例子(用组件)
Vue.component("demo1",{
data:function(){
return {
name:"",
age:"",
city:""
}
},
template:"<ul><li id='name'>{{name}}</li><li>{{age}}</li><li>{{city}}</li></ul>",
created:function(){
this.name="唐浩益"
this.age = "12"
this.city ="杭州"
var x = document.getElementById("name")//第一个命令台错误
console.log(x.innerHTML);
},
mounted:function(){
var x = document.getElementById("name")//第二个命令台输出的结果
console.log(x.innerHTML);
}
});
var vm = new Vue({
el:"#example1"
})
复制代码
// 我写的
for(let i=0; i<res.data.length; i++){
if(res.host){
res.data[i].img = res.host + res.data[i].img;
}else{
res.data[i].img = res.data[i].img;
}
res.data[i].days = res.data[i].days.split(' ')[0];
let arr = res.data[i].times.split('#');
let str = '';
arr.forEach(element => {
str += element+':00、'
});
res.data[i].times = str;
}
// 别人写的
if (res.host) {
for (let i = 0; i < res.data.length; i++) {
res.data[i].img = res.host + res.data[i].img;
res.data[i].days = res.data[i].days.split(' ')[0];
let arr = res.data[i].times.split('#');
let str = '';
arr.forEach(element => {
str += element+':00、'
});
res.data[i].times = str;
}
} else {
for (let i = 0; i < res.data.length; i++) {
res.data[i].img = res.data[i].img;
res.data[i].days = res.data[i].days.split(' ')[0];
let arr = res.data[i].times.split('#');
let str = '';
arr.forEach(element => {
str += element+':00、'
});
res.data[i].times = str;
}
}
复制代码
@import "@/common/css/var.scss";
复制代码
fileChange(e) {
let file = e.target.files[0]
if (file.size > this.maxSize) {
MessageBox('', '图片太大了噢')
} else {
let formData = new FormData()
formData.append('img', file)
api.upload(formData).then(res => {
this.path = res.path
if (res.host) {
this.show = res.host + res.path
} else {
this.show = res.path
}
})
}
},
复制代码
vue2中的路由定义层:<router-linkto="/goods">商品</router-link> 这里用to指向路径表现层
1.一、<keep-alive>若是把切换出去的组件保留在内存中,能够保留它的状态或避免从新渲染。为此能够添加一个keep-alive指令
<keep-alive><router-view:seller="seller">content</router-view></keep-alive>
1.2使用router的过程当中出现的报错状况 提示 (Unknown custom element: <router-view> - did you register the component corre)出现的问题可能有如下几个状况:
1.2.1 <router-link to="/goods">商品</router-link> to不能少 不能少
1.2.2在main.js中 import VueRouter from 'vue-router' 注意大小写的区分
1.2.3 Vue.use(VueRouter) 固然这句也是不能少滴 由于在一个模块化工程中使用router,必需要经过Vue.use() 明确地安装路由功能
1.2.4 剩下的就是按照api来写
const routes = [
{ path:'/goods', component: Goods },
{ path:'/ratings', component: Ratings },
{ path:'/seller', component: Seller }
]
const router = new VueRouter({
routes
})
1.2.5 最后一句
new Vue({
el: '#app',
router ,
render: h => h(App)
})
2.对router的定义与理解
路由,其实就是指向的意思,当我点击页面上的home按钮时,页面中就要显示home的内容,若是点击页面上的about 按钮,页面中就要显示about 的内容。Home按钮 => home 内容, about按钮 => about 内容,也能够说是一种映射. 因此在页面上有两个部分,一个是点击部分,一个是点击以后,显示内容的部分。
  点击以后,怎么作到正确的对应,好比,我点击home 按钮,页面中怎么就正好能显示home的内容。这就要在js 文件中配置路由。
  路由中有三个基本的概念 route, routes, router。
    1, route,它是一条路由,由这个英文单词也能够看出来,它是单数, Home按钮 => home内容, 这是一条route, about按钮 => about 内容, 这是另外一条路由。
    2, routes 是一组路由,把上面的每一条路由组合起来,造成一个数组。[{home 按钮 =>home内容 }, { about按钮 => about 内容}]
    3, router 是一个机制,至关于一个管理者,它来管理路由。由于routes 只是定义了一组路由,它放在哪里是静止的,当真正来了请求,怎么办? 就是当用户点击home 按钮的时候,怎么办?这时router 就起做用了,它到routes 中去查找,去找到对应的 home 内容,因此页面中就显示了 home 内容。
    4,客户端中的路由,实际上就是dom 元素的显示和隐藏。当页面中显示home 内容的时候,about 中的内容所有隐藏,反之也是同样。客户端路由有两种实现方式:基于hash 和基于html5 history api.
vue-router中的路由也是基于上面的内容来实现的
  在vue中实现路由仍是相对简单的。由于咱们页面中全部内容都是组件化的,咱们只要把路径和组件对应起来就能够了,而后在页面中把组件渲染出来。
  1, 页面实现(html模版中)
    在vue-router中, 咱们看到它定义了两个标签<router-link> 和<router-view>来对应点击和显示部分。<router-link> 就是定义页面中点击的部分,<router-view> 定义显示部分,就是点击后,区配的内容显示在什么地方。因此 <router-link> 还有一个很是重要的属性 to,定义点击以后,要到哪里去, 如:<router-link to="/home">Home</router-link>
  2, js 中配置路由
    首先要定义route, 一条路由的实现。它是一个对象,由两个部分组成: path和component. path 指路径,component 指的是组件。如:{path:’/home’, component: home}
    咱们这里有两条路由,组成一个routes:
const routes = [
{ path: '/home', component: Home },
{ path: '/about', component: About }
]
  最后建立router 对路由进行管理,它是由构造函数 new vueRouter() 建立,接受routes 参数。
const router = new VueRouter({
routes // routes: routes 的简写
})
  配置完成后,把router 实例注入到 vue 根实例中,就可使用路由了
const app = new Vue({
router
}).$mount('#app')
  执行过程:当用户点击 router-link 标签时,会去寻找它的 to 属性, 它的 to 属性和 js 中配置的路径{ path: '/home', component: Home} path 一一对应,从而找到了匹配的组件, 最后把组件渲染到 <router-view> 标签所在的地方。全部的这些实现才是基于hash 实现的。
vue-cli 建立一个项目体验一下, 固然不要忘记安装vue-router
  1, 在src 目录下新建两个组件,home.vue 和 about.vue
<template>
<div>
<h1>home</h1>
<p>{{msg}}</p>
</div>
</template>
<script>
export default {
data () {
return {
msg: "我是home 组件"
}
}
}
</script>
<template>
<div>
<h1>about</h1>
<p>{{aboutMsg}}</p>
</div>
</template>
<script>
export default {
data () {
return {
aboutMsg: '我是about组件'
}
}
}
</script>
  2, 在 App.vue中 定义<router-link > 和 </router-view>
<template>
<div id="app">
<img src="./assets/logo.png">
<header>
<!-- router-link 定义点击后导航到哪一个路径下 -->
<router-link to="/home">Home</router-link>
<router-link to="/about">About</router-link>
</header>
<!-- 对应的组件内容渲染到router-view中 -->
<router-view></router-view>
</div>
</template>
<script>
export default {
}
</script>
  3, 在 src目录下再新建一个router.js 定义router, 就是定义 路径到 组件的 映射。
import Vue from "vue";
import VueRouter from "vue-router";
// 引入组件
import home from "./home.vue";
import about from "./about.vue";
// 要告诉 vue 使用 vueRouter
Vue.use(VueRouter);
const routes = [
{
path:"/home",
component: home
},
{
path: "/about",
component: about
}
]
var router = new VueRouter({
routes
})
export default router;
  4, 把路由注入到根实例中,启动路由。这里其实还有一种方法,就像vuex store 注入到根实例中同样,咱们也能够把vueRouter 直接注入到根实例中。在main.js中引入路由,注入到根实例中。
import Vue from 'vue'
import App from './App.vue'
// 引入路由
import router from "./router.js" // import router 的router 必定要小写, 不要写成Router, 不然报 can't match的报错 new Vue({ el: '#app',
router, // 注入到根实例中
render: h => h(App)
})
  5, 这时点击页面上的home 和about 能够看到组件来回切换。可是有一个问题,当首次进入页面的时候,页面中并无显示任何内容。这是由于首次进入页面时,它的路径是 '/',咱们并无给这个路径作相应的配置。通常,页面一加载进来都会显示home页面,咱们也要把这个路径指向home组件。可是若是咱们写{ path: '/', component: Home },vue 会报错,由于两条路径却指向同一个方向。这怎么办?这须要重定向,所谓重定向,就是从新给它指定一个方向,它原本是访问 / 路径,咱们从新指向‘/home’, 它就至关于访问 '/home', 相应地, home组件就会显示到页面上。vueRouter中用 redirect 来定义重定向。
const routes = [
{
path:"/home",
component: home
},
{
path: "/about",
component: about
},
// 重定向
{
path: '/',
redirect: '/home'
}
]
  如今页面正常了,首次进入显示home, 而且点击也能够看到内容的切换。
6, 最后,咱们看一下路由是怎么实现的
  打开浏览器控制台,首先看到 router-link 标签渲染成了 a 标签,to 属性变成了a 标签的 href 属性,这时就明白了点击跳转的意思。router-view 标签渲染成了咱们定义的组件,其实它就是一个占位符,它在什么地方,匹配路径的组件就在什么地方,因此 router-link 和router-view 标签一一对应,成对出现。
  这里还看到,当点击Home和About 来回切换时,a 标签有一个样式类 .router-link-active 也在来回切换, 原来这是当router-link 处于选中状态时,vueRouter 会自动添加这个类,所以咱们也能够利用这个类来改变选中时的状态,如选中时,让它变成红色。但当设置 .router-link-active {color: red;},它并无生效,这时还要在类前面加一个a, a.router-link-active {color: red;}, 这样就没有问题了。未处于选中状态的router-link, 咱们也想给它更改样式,怎么办? 直接给它添加一个 class 就能够了, <router-link class="red">Home</router-link>
动态路由
  上面咱们定义的路由,都是严格匹配的,只有router-link 中的to属性和 js 中一条路由route中 path 如出一辙,才能显示相应的组件component. 但有时现实却不是这样的,当咱们去访问网站并登陆成功后,它会显示 欢迎你,+ 你的名字。不一样的用户登陆, 只是显示“你的名字” 部分不一样,其它部分是同样的。这就表示,它是一个组件,假设是user组件。不一样的用户(就是用户的id不一样),它都会导航到同一个user 组件中。这样咱们在配置路由的时候,就不能写死, 就是路由中的path属性,不能写死,那要怎么设置? 导航到 user 组件,路径中确定有user, id 不一样,那就给路径一个动态部分来匹配不一样的id. 在vue-router中,动态部分 以 : 开头,那么路径就变成了 /user/:id, 这条路由就能够这么写: { path:"/user/:id", component: user }.
  咱们定义一个user组件(本身随便写一个就行了),页面中再添加两个router-link 用于导航, 最后router.js中添加路由配置,来体验一下
  app.vue 中添加两个router-link:
<template>
<div id="app">
<img src="./assets/logo.png">
<header>
<router-link to="/home">Home</router-link>
<router-link to="/about">About</router-link>
<!-- 增长两个到user组件的导航,能够看到这里使用了不一样的to属性 -->
<router-link to="/user/123">User123</router-link>
<router-link to="/user/456">User456</router-link>
</header>
<router-view></router-view>
</div>
</template>
router.js 配置user动态路由:
const routes = [
{
path:"/home",
component: home
},
{
path: "/about",
component: about
},
/*新增user路径,配置了动态的id*/
{
path: "/user/:id",
component: user
},
{
path: '/',
redirect: '/home'
}
]
  user组件
<template>
<div>
<h1>User</h1>
<div>我是user组件</div>
</div>
</template>
<script>
export default {
}
</script>
  这时在页面中点击user123 和user456, 能够看到它们都导航到user组件,配置正确。   
  在动态路由中,怎么获取到动态部分? 由于在组件中是能够显示不一样部分的,就是上面提到的“你的名字”。其实,当整个vue-router 注入到根实例后,在组件的内部,能够经过this.$route 来获取到 router 实例。它有一个params 属性,就是来得到这个动态部分的。它是一个对象,属性名,就是路径中定义的动态部分 id, 属性值就是router-link中to 属性中的动态部分,如123。使用vuex时,组件中想要获取到state 中的状态,是用computed 属性,在这里也是同样,在组件中,定义一个computed 属性dynamicSegment, user 组件修改以下:
<template>
<div>
<h1>User</h1>
<div>我是user组件, 动态部分是{{dynamicSegment}}</div>
</div>
</template>
<script>
export default {
computed: {
dynamicSegment () {
return this.$route.params.id
}
}
}
</script>
  这里还有最后一个问题,就是动态路由在来回切换时,因为它们都是指向同一组件,vue不会销毁再建立这个组件,而是复用这个组件,就是当第一次点击(如:user123)的时候,vue 把对应的组件渲染出来,但在user123, user456点击来回切换的时候,这个组件就不会发生变化了,组件的生命周期无论用了。这时若是想要在组件来回切换的时候作点事情,那么只能在组件内部(user.vue中)利用watch 来监听$route 的变化。把上面的代码用监听$route 实现
<script>
export default {
data () {
return {
dynamicSegment: ''
}
},
watch: {
$route (to,from){
// to表示的是你要去的那个组件,from 表示的是你从哪一个组件过来的,它们是两个对象,你能够把它打印出来,它们也有一个param 属性
console.log(to);
console.log(from);
this.dynamicSegment = to.params.id
}
}
}
</script>
嵌套路由
  嵌套路由,主要是由咱们的页面结构所决定的。当咱们进入到home页面的时候,它下面还有分类,如手机系列,平板系列,电脑系列。当咱们点击各个分类的时候,它仍是须要路由到各个部分,如点击手机,它确定到对应到手机的部分。
  在路由的设计上,首先进入到 home ,而后才能进入到phone, tablet, computer. Phone, tablet, compute 就至关于进入到了home的子元素。因此vue 提供了childrens 属性,它也是一组路由,至关于咱们所写的routes。
  首先,在home页面上定义三个router-link 标签用于导航,而后再定义一个router-view标签,用于渲染对应的组件。router-link 和router-view 标签要一一对应。home.vue 组件修改以下:
<template>
<div>
<h1>home</h1>
<!-- router-link 的to属性要注意,路由是先进入到home,而后才进入相应的子路由如 phone,因此书写时要把 home 带上 -->
<p>
<router-link to="/home/phone">手机</router-link>
<router-link to="/home/tablet">平板</router-link>
<router-link to="/home/computer">电脑</router-link>
</p>
<router-view></router-view>
</div>
</template>
router.js 配置路由,修改以下:
const routes = [
{
path:"/home",
     // 下面这个属性也很多,由于,咱们是先进入home页面,才能进入子路由
component: home,
     // 子路由
children: [
{
path: "phone",
component: phone
},
{
path: "tablet",
component: tablet
},
{
path: "computer",
component: computer
}
]
},
{
path: "/about",
component: about
},
{
path: "/user/:id",
component: user
},
{
path: '/',
redirect: '/home'
}
]
  这时当咱们点击home 时,它下面出现手机等字样,但没有任何对应的组件进行显示,这一般不是咱们想要的。要想点击home时,要想渲染相对应的子组件,那还须要配置一条路由。当进入到home 时,它在children中对应的路由path 是空 ‘’,完整的childrens 以下:
children: [
{
path: "phone",
component: phone
},
{
path: "tablet",
component: tablet
},
{
path: "computer",
component: computer
},
// 当进入到home时,下面的组件显示
{
path: "",
component: phone
}
]
命名路由
  命名路由,很简单,由于根据名字就能够知道,这个路由有一个名字,那就直接给这个路由加一个name 属性,就能够了。 给user 路由加一个name 属性:
{
path: "/user/:id",
name: "user",
component: user
}
  命名路由的使用, 在router-link 中to 属性就可使用对象了,
<router-link to="/user/123">User123</router-link> // 和下面等价
<router-link :to="{ name: 'user', params: { userId: 123 }}">User</router-link> // 当使用对象做为路由的时候,to前面要加一个冒号,表示绑定
  编程式导航:这主要应用到按钮点击上。当点击按钮的时候,跳转另外一个组件, 这只能用代码,调用rourter.push() 方法。 当们把router 注入到根实例中后,组件中经过 this.$router 能够获取到router, 因此在组件中使用
this.$router.push("home"), 就能够跳转到home界面
复制代码
import { Tabbar, TabItem } from 'mint-ui';
<mt-tabbar v-model="selected">
<mt-tab-item id="tab1">
<img slot="icon" src="../assets/100x100.png">
tab1
</mt-tab-item>
<mt-tab-item id="tab2">
<img slot="icon" src="../assets/100x100.png">
tab2
</mt-tab-item>
<mt-tab-item id="tab3">
<img slot="icon" src="../assets/100x100.png">
tab3
</mt-tab-item>
<mt-tab-item id="tab4">
<img slot="icon" src="../assets/100x100.png">
tab4
</mt-tab-item>
</mt-tabbar>
复制代码
youzan.github.io/vant/#/zh-C… segmentfault.com/a/119000001…
<van-tabbar v-model="active">
<van-tabbar-item icon="shop">标签</van-tabbar-item>
<van-tabbar-item icon="chat" dot>标签</van-tabbar-item>
<van-tabbar-item icon="records" info="5">标签</van-tabbar-item>
<van-tabbar-item icon="gold-coin" info="20">标签</van-tabbar-item>
</van-tabbar>
export default {
data() {
return {
active: 0
}
}
}
### 自定义图标
经过 icon 插槽自定义图标,能够经过 slot-scope 判断标签是否选中
<van-tabbar v-model="active">
<van-tabbar-item info="3">
<span>自定义</span>
<img
slot="icon"
slot-scope="props"
:src="props.active ? icon.active : icon.normal"
>
</van-tabbar-item>
<van-tabbar-item icon="chat">标签</van-tabbar-item>
<van-tabbar-item icon="records">标签</van-tabbar-item>
</van-tabbar>
export default {
data() {
return {
active: 0,
icon: {
normal: '//img.yzcdn.cn/icon-normal.png',
active: '//img.yzcdn.cn/icon-active.png'
}
}
}
}
复制代码
import apiConfig from './api_config.js'
import axios from 'axios'
/**
* api.login({
* username: 'qwe',
* password: 123456
* }).then((res) => {
* console.log(res)
* })
*/
const obj = {}
for(let i in apiConfig) {
let config = apiConfig[i]
obj[i] = function(params) {
return new Promise((resolve, reject) => {
let opt = {
method: config.method || 'get',
url: config.url,
}
if (config.method == 'post') {
opt.data = params
} else {
opt.params = params
}
axios(opt)
.then((res) => {
if (res.data.code == 1) {
resolve(res.data)
} else {
console.log(res.data.msg)
reject(res.data)
}
})
.catch(error => {
console.log(error)
// alert('网络遇到问题,请稍后再试')
})
})
}
}
export default obj
复制代码
父组件向子组件传值成功
总结一下:
子组件在props中建立一个属性,用以接收父组件传过来的值
父组件中注册子组件
在子组件标签中添加子组件props中建立的属性
把须要传给子组件的值赋给该属性
复制代码
子组件向父组件传值成功
总结一下:
子组件中须要以某种方式例如点击事件的方法来触发一个自定义事件
将须要传的值做为$emit的第二个参数,该值将做为实参传给响应自定义事件的方法
在父组件中注册子组件并在子组件标签上绑定对自定义事件的监听
在通讯中,不管是子组件向父组件传值仍是父组件向子组件传值,他们都有一个共同点就是有中间介质,子向父的介质是自定义事件,父向子的介质是props中的属性。抓准这两点对于父子通讯就好理解了
复制代码
$nextTick(function(){
this.$refs.input.focus();
// 获取更新以后的DOM
})
new Vue({
el: '#app',
data: {
isShow:false
},
template:`
<div class="update">
<input type="text" v-show="isShow">
</div>
`,
mounted(){
// 更新DOM以后再去聚焦输入框
console.log(this.$refs.input)
this.isShow = true;
console.log(this.$refs.input)
this.$nextTick(function(){
this.$refs.input.focus()
})
},
})
复制代码
blog.csdn.net/AprilCC/art… www.jianshu.com/p/4062a1fe0…
router-link 连接到那个路由对应的组件 router-view 显示出路由对应组件
<div id="app">
<p>
<router-link to="/user/foo">/user/foo</router-link>
<router-link to="/user/foo/profile">/user/foo/profile</router-link>
<router-link to="/user/foo/posts">/user/foo/posts</router-link>
</p>
<router-view></router-view>
</div>
复制代码
命名路由 有时候,经过一个名称来标识一个路由显得更方便一些,特别是在连接一个路由,或者是执行一些跳转的时候。 能够在建立Router实例的时候,在routes配置中给某个路由设置名称。
const router = new VueRouter({
routes: [
{
path: '/user/:user:id',
name: 'user',===>给路由命名
component: User
}
]
})
复制代码
要连接到一个命名路由,能够给router-link的to属性传一个对象: User
跟代码调用 router.push()是一回事:
router.push({ name: 'user', params: { userId: 123 }})
复制代码
import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)
const Home = { template: '<div>This is Home</div>' }
const Foo = { template: '<div>This is Foo</div>' }
const Bar = { template: '<div>This is Bar {{ $route.params.id }}</div>' }
const router = new VueRouter({
mode: 'history',
base: __dirname,
routes: [
{ path: '/', name: 'home', component: Home },
{ path: '/foo', name: 'foo', component: Foo },
{ path: '/bar', name: 'bar', component: Bar }
]
})
new Vue({
router,
template: `
<div id="app">
<h1>Named Routes</h1>
<p>Current route name: {{ route.name }}</p>
<ul>
<li><router-link :to="{ name: 'home' }">Home</router-link></li>
<li><router-link :to="{ name: 'foo' }">foo</router-link></li>
<li><router-link :to="{ name: 'bar', params: { id: 123 }}">bar</router-link></li>
</ul>
<router-view class="view"></router-view>
</div>
`
}).$.mount('#app')
复制代码
例子
import Vue from 'vue'
import Router from 'vue-router'
import home from '@/pages/home'
import header from '@/components/header'
import menu from '@/components/menu'
import content from '@/components/content'
import list from '@/components/list'
import detail from '@/components/detail'
Vue.use(Router)
export default new Router({
routes: [
{
path: '/',
redirect: '/home/menu'
},
{
path: '/home',
name: 'home',
component: home,
children: [{
path: 'menu',
components: {
header: header,
menu: menu,
content: content
},
children: [
{
path: 'list/:index',
name: 'list',
component: list
},
{
path: 'list/:index/detail/:detailIndex',
name: 'detail',
component: detail
}
]
}]
},
{
path: '/detailNoMenu',
name: 'detailNoMenu',
component: detail
}
]
})
复制代码
www.cnblogs.com/momozjm/p/7… blog.csdn.net/zhangwenwu2… 一:跨域请求代理 ·
module.exports{
dev: {
}
}
proxyTable: {
'/api': {
target: 'http://121.41.130.58:9090',//设置你调用的接口域名和端口号 别忘了加http
changeOrigin: true,
pathRewrite: {
'^/api': ''//这里理解成用‘/api’代替target里面的地址,后面组件中咱们掉接口时直接用api代替 好比我要调用'http://40.00.100.100:3002/user/add',直接写‘/api/user/add’便可
}
}
}
复制代码
2:在须要调接口的组件中这样使用:
axios.post('/api/yt_api/login/doLogin',postData)
.then(function (response) {
console.log(1)
console.log(response);
})
.catch(function (error) {
console.log(error);
})
复制代码
注意:原接口:http://http://121.41.130.58:9090/yt_api/login/doLogin 页面调用:http://localhost:8081/api/yt_api/login/doLogin ——这里多了一个/api/不是多余的,不要删
二:axios传参 1:Vue官方推荐组件axios默认就是提交 JSON 字符串,因此咱们要以json字符串直接拼接在url后面的形式,直接将json对象传进去就好了
let postData = {
  companyCode:'tur',
  userName:'123456789123456789',
  password:'123456'
}
axios.get('/api/yt_api/login/doLogin',{
  params: {
    ...postData,
  }
})
.then(function (response) {
  console.log(1)
  console.log(response);
})
.catch(function (error) {
  console.log(error);
});
复制代码
这里咱们将postData这个json对象传入到post方法中,页面中的形式为:
2:以key:val的形式传参
let postData = qs.stringify({
companyCode:'tur',
userName:'123456789123456789',
password:'123456'
})
复制代码
咱们须要对这个json对象操做,这里的qs你须要先安装
npm install qs
复制代码
再导入
import qs from 'qs'
复制代码
面中的形式为:
执行 GET 请求
// 向具备指定ID的用户发出请求
axios.get('/user?ID=12345')
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
// 也能够经过 params 对象传递参数
axios.get('/user', {
params: {
ID: 12345
}
})
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
复制代码
执行 POST 请求
axios.post('/user', {
firstName: 'Fred',
lastName: 'Flintstone'
})
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
复制代码
var arr = [{
days: "2018-11-28",
id: 166,
img: "http://modelplus.wx-plus.cn/public/upload/img/20181101/cdb5b0718adc5f96995adae7a728a744.jpg",
model_id: 2,
name: "神经病",
status: 1,
times: "11:00、12:00",
user_id: 3
},
{
days: "2018-11-28",
id: 168,
img: "http://modelplus.wx-plus.cn/public/upload/img/20181101/cdb5b0718adc5f96995adae7a728a744.jpg",
model_id: 2,
name: "神经病",
status: 1,
times: "9:00、10:00",
user_id: 3,
},
{
days: "2018-12-03",
id: 161,
img: "http://modelplus.wx-plus.cn/public/upload/img/20181101/cdb5b0718adc5f96995adae7a728a744.jpg",
model_id: 2,
name: "神经病",
status: 1,
times: "10:00",
user_id: 3,
},
{
days: "2018-12-03",
id: 161,
img: "http://modelplus.wx-plus.cn/public/upload/img/20181101/cdb5b0718adc5f96995adae7a728a744.jpg",
model_id: 2,
name: "神经病",
status: 1,
times: "11:00、12:00",
user_id: 3,
},
{
days: "2018-11-23",
id: 150,
img: "http://modelplus.wx-plus.cn/public/upload/img/20181101/f27cd3716e375070a335eb8203a8d9ec.png",
model_id: 11,
name: "大小兄弟",
status: 1,
times: "9:00、10:00、11:00",
user_id: 3,
},
{
days: "2018-11-24",
id: 149,
img: "http://modelplus.wx-plus.cn/public/upload/img/20181101/f27cd3716e375070a335eb8203a8d9ec.png",
model_id: 11,
name: "大小兄弟",
status: 1,
times: "10:00、16:00、21:00",
user_id: 3,
},
{
days: "2018-12-04",
id: 162,
img: "http://modelplus.wx-plus.cn/public/upload/img/20181101/f27cd3716e375070a335eb8203a8d9ec.png",
model_id: 11,
name: "大小兄弟",
status: 1,
times: "9:00",
user_id: 3,
}]
for(var i=0;i<arr.length;i++){
for(var j=i+1;j<arr.length;j++){
if(arr[i].days==arr[j].days){
arr[i].times = arr[i].times.split('、').concat(arr[j].times.split('、')).join("、")
arr.splice(j,1);
}
}
}
console.log(arr)
// 获取游客预定成功的信息
getUserOrder() {
api.getUserOrder({
user_id: localStorage.getItem("user_id")
}).then(res => {
console.log("res",res.data);
this._handler(res.data)
console.log("res.data",res.data);
for(let i=0; i < res.data.length; i++){
if(res.host){
res.data[i].img = res.host + res.data[i].img;
}else{
res.data[i].img = res.data[i].img;
}
res.data[i].days = res.data[i].days.split(' ')[0];
// console.log('res.data[i].days',data[i].days)
let arr = res.data[i].times.split('#');
let str = '';
arr.forEach(element => {
str += element + ':00、'
});
str = str.substr(0,str.length-1)
res.data[i].times = str;
}
// console.log("res.data",res.data)
this.list = res.data;
console.log("this.list",this.list)
});
},
// 处理相同日期字段的不一样times字段数据
_handler(arr){
for(var i = 0; i < arr.length; i++){
for(var j = i+1; j < arr.length; j++){
if(arr[i].days == arr[j].days){
arr[i].times = arr[i].times.split('、').concat(arr[j].times.split('、')).join("、").replace("、","#")
// arr[i].times = arr[i].times.substr(0,arr[i].times.length-1)
console.log("arr[i].times",arr[i].times)
arr.splice(j,1);
}
}
}
},
复制代码
www.cnblogs.com/liuzhouyuan… www.cnblogs.com/xiaotanke/p…
const bURI = "http://modelplus.wx-plus.cn/index.php/modelapi/Model_Api/"
const proxy_url = '/api/'
const devU = process.env.NODE_ENV == "development" ? proxy_url : bURI
复制代码
// vue.config.js
module.exports = {
baseUrl : "./",
devServer: {
port: 8080,
open: true,
proxy: {
'/api': {
target: 'http://modelplus.wx-plus.cn/index.php/modelapi/Model_Api/',
changeOrigin: true,
pathRewrite: {
'^/api': ''
}
},
'/upload': {
target: 'http://xxx.com',
changeOrigin: true,
pathRewrite: {
'^/upload': ''
}
},
}
}
}
复制代码
须要先安装 node-sass及sass-loader
npm i node-sass --save-dev
npm i sass-loader --save-dev
复制代码
解决在scss中引用图片路径报错: 方法1:在mian.js中引入,这种引入方式时,scss中图片使用相对路径
require('./assets/style/index.scss')
或 import './assets/style/index.scss'
复制代码
方法2:在app.vue中引入,借助webpack的~
前缀
<style lang="scss">
@import '~@/assets/style/index'
</style>
复制代码
~
前缀才解析为模块路径。方法3:在*.vue中的scss中直接使用图片
方法4:在*.vue中直接经过require引用图片,而后在html中经过 :style="{backgroundImage: 'url('+ 变量 +')'}" 绑定使用
axios.defaults.baseURL = 'https://api.example.com';
axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
https://github.com/axios/axios
复制代码
https://cli.vuejs.org/zh/guide/deployment.html#%E9%80%9A%E7%94%A8%E6%8C%87%E5%8D%97
// 设置全局的baseURL配置
// axios.defaults.baseURL = process.env.NODE_ENV?'/api/':"http://modelplus.wx-plus.cn/index.php/modelapi/Model_Api/";
复制代码
webpack.docschina.org/ webpack.css88.com/
当你使用 history 模式时,URL 就像正常的 url,例如 yoursite.com/user/id,也好看…
不过这种模式要玩好,还须要后台配置支持。由于咱们的应用是个单页客户端应用,若是后台没有正确的配置,当用户在浏览器直接访问 oursite.com/user/id 就会返回 404,这就很差看了。
因此呢,你要在服务端增长一个覆盖全部状况的候选资源:若是 URL 匹配不到任何静态资源,则应该返回同一个 index.html 页面,这个页面就是你 app 依赖的页面。
每次打包都会从新生成那个title
segmentfault.com/q/101000000… vue-meta github.com/declandewet… blog.csdn.net/nickroprak/…
// 动态改变title的名称
router.beforeEach((to, from, next) => {
/* 路由发生变化修改页面title */
if (to.meta.title) {
document.title = to.meta.title
}
next()
})
复制代码
碰到一个问题就是经过本地缓存角色 改变角色 computed()
created mounted
www.cnblogs.com/lixiangyong… www.cnblogs.com/shenxiaolin…
lib.csdn.net/article/htm… www.cnblogs.com/frontdeend/… www.yaxi.net/2018-01-10/…
www.cnblogs.com/Megasu/p/41… github.com/maxzhang/ma… github.com/maxzhang/ma…
blog.csdn.net/accountwcx/… www.cnblogs.com/winyh/p/671…
Getter is missing for computed property "watch". 是由于我把这个watch放在了computed属性里面了,应该是跟watch同级存放
baijiahao.baidu.com/s?id=159012… blog.csdn.net/ReusLi/arti… www.vue-js.com/topic/5b969… blog.csdn.net/echo_ae/art…
这种方式是不会获取的到$data属性的
created() {
this._getModelVisitorTime();
this.getDateList();
this.getModelInfo();
this.getTimeList();
},
复制代码
created() {
this._getModelVisitorTime();
this.getDateList();
this.getModelInfo();
},
_getModelVisitorTime() {
api.getModelOrder({
model_id: this.$route.params.id,
}).then(res => {
console.log('getModelOrder',res)
var obj = {};
var data = res.data;
for (let i of data) {
let key = i.days.split(' ')[0];
let val = i.times.split('#');
obj[key] = val;
}
this.schedule = obj;
## 下面的this.getTimeList()须要用到上面的this.schedule这个数据
## 因此咱们要等数据赋值完成以后才执行下面这一句代码
this.getTimeList();
});
},
复制代码
blog.csdn.net/dongguan_12… www.jianshu.com/p/4450b63a2… api接口发送的是异步操做,可是获取数据要等到异步操做完成才能获取获得 若是说有一些同步操做须要用到异步操做返回的数据,因此要
//有时候咱们这种
mounted(){
setTimeout(()=>{
this.getTimeList();
}, 2000)
},
复制代码
www.cnblogs.com/handsomer/p… www.cnblogs.com/malcolmfeng…
地址:dwz.cn/JjBQtWNJ , 帐号:762845 , 密码:LLO873 地址:dwz.cn/JjBQtWNJ , 帐号:555308 , 密码:PTL239
地址:dwz.cn/JjBQtWNJ , 帐号:566468 , 密码:WBB678
www.cnblogs.com/cuixiaozhen… www.jianshu.com/p/2e5e2f5a0… blog.csdn.net/zuorishu/ar… 其中有个bug就是不断的点击以后,会出现重叠二维码 因此每次点击都要把容器的内容清除一下 document.getElementById("qrcode").innerHTML = '';
www.jb51.net/article/121… blog.csdn.net/qq_36069339…
www.cnblogs.com/0201zcr/p/5… mp.weixin.qq.com/wiki?t=reso… mp.weixin.qq.com/debug/cgi-b… www.cnblogs.com/0201zcr/p/5… www.cnblogs.com/0201zcr/p/5… www.php.cn/weixin-kaif… www.cnblogs.com/0201zcr/p/5…
我用git add file添加文件时出现这样错误:
fatal: Not a git repository (or any of the parent directories): .git
提示说没有.git这样一个目录,解决办法以下:
git init就能够了!
当一我的找不到出路的时候,最好的办法就是将当前能作好的事情作到极致,作到无人能及。
复制代码
方法一:
git remote rm origin
git remote add origin git@github.com:Liutos/foobar.git
方法二:
git remote origin set-url <URL>
把<URL>替换成新的url地址。
方法三:
直接修改.git/config文件
---------------------
做者:I-T枭
来源:CSDN
原文:https://blog.csdn.net/hahahhahahahha123456/article/details/81328244
版权声明:本文为博主原创文章,转载请附上博文连接!
复制代码
地址:dwz.cn/JjBQtWNJ , 帐号:361330 , 密码:AFA793
颜色搭配 #f73688;
选取文本域的内容:
document.getElementById('input').select();
复制代码
console.log(this.message);
var oInput = document.createElement('input');
oInput.value = this.message;
document.body.appendChild(oInput);
oInput.select(); // 选择对象
document.execCommand("Copy"); // 执行浏览器复制命令
oInput.style.display='none';
MessageBox('', '已复制好,可贴粘')
复制代码
https://www.cnblogs.com/zhg277245485/p/6582033.html
复制代码
https://www.cnblogs.com/PeunZhang/p/3324727.html
https://www.jb51.net/article/132317.htm
复制代码
https://www.cnblogs.com/daiwenru/p/7910363.html
https://www.cnblogs.com/websmile/p/8258481.html
ref 有两种用法
1.ref 加在普通的元素上,用this.ref.name 获取到的是dom元素
2.ref 加在子组件上,用this.ref.name 获取到的是组件实例,可使用组件的全部方法。
3.如何利用v-for 和ref 获取一组数组或者dom 节点
复制代码
https://www.cnblogs.com/liuxiaowei/p/7168493.html
https://www.zhangxinxu.com/wordpress/2014/10/responsive-images-srcset-size-w-descriptor/
复制代码
lang="scss"
地址:dwz.cn/JjBQtWNJ , 帐号:542860 , 密码:FPW019
www.jb51.net/article/140… www.jb51.net/article/144… www.cnblogs.com/yiguozhi/p/… blog.csdn.net/qq_16772725…
www.jb51.net/article/150… require: 以同步的方式检索其余模块的导出 (开发) import: 动态地加载模块 (生产)
blog.csdn.net/lily2016n/a… vue中"‘webpack-dev-server’不是内部或外部命令,也不是可运行的程序"的报错
git status ls vim git commit -m git commit git add -a
地址:dwz.cn/JjBQtWNJ , 帐号:a9ebbc , 密码:8fe077 地址:dwz.cn/JjBQtWNJ , 帐号:e98f28 , 密码:9bd8e3
切换成中文状态:CHCP 936 切换成UTF-8状态:CHCP 65001
www.jb51.net/article/122… www.jb51.net/article/109…
地址:dwz.cn/JjBQtWNJ , 帐号:958b13 , 密码:1ed548
blog.csdn.net/hcy0404/art… blog.csdn.net/z1587739528…
www.cnblogs.com/webcome/p/5… www.jianshu.com/p/dacd42345…
定义:让网站服务器把少许数据储存到客户端的硬盘或内存,从客户端的硬盘读取数据的一种技术;
下载与引入:jquery.cookie.js基于jquery;
先引入jquery,再引入:jquery.cookie.js;下载:http://plugins.jquery.com/cookie/
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/jquery.cookie.js"></script>
使用:
1.添加一个"会话cookie"
$.cookie('the_cookie', 'the_value');
这里没有指明 cookie有效时间,所建立的cookie有效期默认到用户关闭浏览器为止,因此被称为 “会话cookie(session cookie)”。
复制代码
www.cnblogs.com/yupeng/p/43… www.jianshu.com/p/bb88f7520… gitee.com/javen205/we… gitee.com/javen205/we…
JavaScript 中的FileReader对象(实现上传图片预览) - LO-..._博客园 www.cnblogs.com/LO-gin/p/68…
segmentfault.com/q/101000000… www.coozhi.com/youxishuma/…
解决手机拍照预览图片自适应
<style>
img#blah{
background-size: cover;
width: 100%;
height: auto;
}
</style>
复制代码
!(function (doc, win) {
var el = doc.documentElement;
//resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize';
function setSize() {
var w = el.clientWidth;
if (!w) return;
w=w>480?480:w;
w=w<320?320:w;
el.style.fontSize = (100 * (w / 1080)).toFixed(3) + 'px';
//1rem至关于1080的图中的100px,最小320px,最大480px,超过这个尺寸后rem与px的换算比例再也不变化
}
if (!doc.addEventListener) return;
setSize();
win.addEventListener('resize', setSize, false);
win.addEventListener('pageshow', function(e) {
if (e.persisted) {
setSize();
}
}, false);
})(document, window);
复制代码
code.ciaoca.com/javascript/… www.cnblogs.com/net-xiejun/…
var fd = new FormData(document.getElementById("fileinfo"));
fd.append("CustomField", "This is some extra data");
$.ajax({
url: "stash.php",
type: "POST",
data: fd,
processData: false, // 告诉jQuery不要去处理发送的数据
contentType: false // 告诉jQuery不要去设置Content-Type请求头
});
复制代码
www.jianshu.com/p/04a5b4976… blog.csdn.net/you23hai45/…
segmentfault.com/a/119000001… blog.csdn.net/weixin_4179…
为啥 感受好像只能把点击事件绑定在最外层的父级上面 下面这样是有效的
<div
class="book-cell"
v-for="(item,index) in ModelVisitorInfo"
:key="index" @click.stop="toMore(item.id)">
<div class="icon">
<img :src="item.img">
</div>
<div class="info">
<div class="name">{{ item.name }}</div>
<div class="desc">身高/{{ item.height }}CM 三围/{{ item.san }}</div>
</div>
<div class="btn" >更多</div>
<!-- 清除浮动 -->
<div class="clear"></div>
</div>
复制代码
这种确是只有最后一项有效
<div
class="book-cell"
v-for="(item,index) in ModelVisitorInfo"
:key="index" >
<div class="icon">
<img :src="item.img">
</div>
<div class="info">
<div class="name">{{ item.name }}</div>
<div class="desc">身高/{{ item.height }}CM 三围/{{ item.san }}</div>
</div>
<div @click.stop="toMore(item.id)" class="btn" >更多</div>
<!-- 清除浮动 -->
<div class="clear"></div>
</div>
复制代码
git add module git commit -m"" git push
esprima.org/demo/parse.… segmentfault.com/a/119000001… blog.csdn.net/sysuzhyupen… segmentfault.com/a/119000001… blog.csdn.net/QY_SUN/arti… github.com/jquery/espr… 能够将源码提取成语法树 github.com/estools/esc… 语法树还原为源码 www.cnblogs.com/tugenhua070… blog.csdn.net/lichwei1983… segmentfault.com/a/119000001…
blog.csdn.net/best_cxy/ar… www.jianshu.com/p/5e47aae71…
www.jianshu.com/p/50657f9af… blog.csdn.net/QQ254360258… www.qinziheng.com/xiaochengxu… www.cnblogs.com/51zxba/p/95… blog.csdn.net/henryhu712/…
www.cnblogs.com/yexiaochai/… editor.swagger.io/ www.cnblogs.com/FlyAway2013… www.cnblogs.com/lovesong/p/…
www.cnblogs.com/qiheng/p/34… www.cnblogs.com/kangshuai/p… www.cnblogs.com/wwqianduan/…
------------------
|
|用户名:username
|邮箱:email
|密码:password
|登陆
|
------------------
须要提交到哪里去:url:?
请求方式:POST
请求参数:{
email: string,
password: string,
username: string
checkCode: string
}
返回数据:{
code: int //错误编码,登陆成功为0,其余错误为>0
result: {
id: int//用户ID
name: string//用户名
},
msg:""
}
复制代码
blog.csdn.net/mrnoboday/a… www.cnblogs.com/momoweiduan…
www.cnblogs.com/worldly1013… blog.csdn.net/cddcj/artic…
www.jutui360.com/view-3599.h… www.4u4v.net/wei-xin-xia… blog.csdn.net/jlq_diligen…
###前端测试 www.imooc.com/article/det…
1.vue-cli3.0 scss全局文件设置 www.jianshu.com/p/f2038e10e…
blog.csdn.net/oscar999/ar… blog.csdn.net/oscar999/ar… blog.csdn.net/oscar999/ar… blog.csdn.net/oscar999/ar… blog.csdn.net/oscar999/ar… blog.csdn.net/oscar999/ar… blog.csdn.net/oscar999/ar… blog.csdn.net/oscar999/ar…
jquery.js:2 POST http://bm.carpenterhome.cn/api/Carpenter_api/uploadimg.html 500 (Internal Server Error)
send @ jquery.js:2
ajax @ jquery.js:2
postFile @ pactUploadNowBtnClick.js:75
(anonymous) @ pactUploadNowBtnClick.js:57
dispatch @ jquery.js:2
y.handle @ jquery.js:2
index.html:1 Access to XMLHttpRequest at 'http://bm.carpenterhome.cn/api/Carpenter_api/uploadimg.html' from origin 'null' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
复制代码
通常让后台设置一下跨域 jquery.ajax()也能够设置跨域请求
https://blog.csdn.net/hu_feng903/article/details/70227953
复制代码
blog.csdn.net/little_litt… blog.csdn.net/tangxiujian…
blog.csdn.net/ZNYSYS520/a… www.cnblogs.com/luxiaoxing/…
.toast-msg {
position: fixed;
top: 50%;
left: 50%;
color: white;
-webkit-transform: translate(-50%,0%);
transform:translate(-50%,0%);
background-color: rgba(0, 0, 0, 0.7);
padding: 20px 40px;
border-radius: 5px;
}
复制代码
.countDown p { position: absolute; font-size: 4vw; top: 40%; left: 50%; width: 60%; -webkit-transform: translate(-50%,0%); transform:translate(-50%,0%); text-align: center; line-height: 0px; } www.cnblogs.com/lidongfeng/… github.com/amfe/articl… www.cnblogs.com/hyx626/p/97… blog.csdn.net/this_tall_p…
blog.csdn.net/buppt/artic… blog.csdn.net/qq_35430000…
www.ml-ui.com/#/docs/i-vi… segmentfault.com/a/119000001…
github.com/sunseekers/… www.cnblogs.com/ndos/p/9642… www.cnblogs.com/ndos/catego…
www.cnblogs.com/cench/p/580… blog.csdn.net/wojiaomaxia…
module.exports = {
plugins: {
'autoprefixer': {},
}
}
复制代码
www.linuxidc.com/Linux/2018-… www.cnblogs.com/wujuntian/p… www.cnblogs.com/xxoome/p/58…
www.deboy.cn/Vue-mixins-… blog.csdn.net/u014452812/… www.cnblogs.com/Ivy-s/p/993… blog.csdn.net/kuangshp128…
www.cnblogs.com/yangjj1216/… blog.csdn.net/bright2017/… blog.csdn.net/maodoudou12… www.cnblogs.com/qianduantin… blog.csdn.net/p930318/art…
blog.csdn.net/wood2016/ar… blog.csdn.net/wang_magent… blog.csdn.net/supergao222… www.xuanfengge.com/placeholder…
juejin.im/post/598aab… segmentfault.com/a/119000001… zh.nuxtjs.org/guide/insta…
www.cnblogs.com/xiaohuochai… www.webhek.com/post/reques…
blog.csdn.net/qyaroon/art… www.cnblogs.com/xiaohuochai… www.cnblogs.com/xiaohuochai…
www.tuicool.com/articles/3Q… www.cnblogs.com/lvmingyin/p… www.cnblogs.com/chaojidan/p…
segmentfault.com/a/119000000… Unable to preventDefault inside passive event listener due to target being treated as passive
会使得click事件失效
@touchstart.stop.prevent="middleTouchStart"
@touchmove.stop.prevent="middleTouchMove"
@touchend.stop.prevent="middleTouchEnd"
复制代码
javascript 事件流 捕获与冒泡 segmentfault.com/a/119000001…
segmentfault.com/a/119000000… segmentfault.com/a/119000001… www.jianshu.com/p/6e2b68a93…
// cursor:pointer;
segmentfault.com/q/101000000… www.cnblogs.com/jjworld/p/7…
www.cnblogs.com/zhrn/p/4819… www.cnblogs.com/zimengxiyu/…
blog.csdn.net/huwei2003/a… blog.csdn.net/huwei2003/a… blog.csdn.net/huwei2003/a…
www.cnblogs.com/lanxianshen… www.cnblogs.com/lhat/p/4800…
www.kancloud.cn/jabber/word… codex.wordpress.org/zh-cn:WordP…
dzblog.cn/article/5a6… mp.weixin.qq.com/s/iwh4fVci0… github.com/ikcamp/koa2… segmentfault.com/a/119000001…
基于 Vue 2.0 实现的移动端弹窗 (Alert, Confirm, Toast)组件. blog.csdn.net/yelin042/ar… www.cnblogs.com/daizhong/p/… blog.csdn.net/qq_33599109… baijiahao.baidu.com/s?id=159085…
blog.csdn.net/lifa1/artic… blog.csdn.net/wang123459/…
如是说如是 blog.csdn.net/nuli888/art… blog.csdn.net/suxianbaozi… www.cnblogs.com/lovekingly/… blog.csdn.net/lishanleili…
blog.csdn.net/obkoro1/art… obkoro1.com/ juejin.im/user/58714f…
就是在使用mint-ui的时候,咱们须要全局引入样式mint/lib/style.css