uni-app知识点和项目上遇到的问题和解决办法的记录
参考文章@flex布局设置space-between(around)最后一行不左对齐问题-解决办法@[译]当咱们在使用displayflex的时候,到底发生了什么?大家可能都遇到过下面这种情况,在布局的时候我们不得不设置并且效果本来想是下面这张图右边的效果,但是显示的却是左边的效果了其实解决也很简单,在最外层添加一个伪类即可html结构...
文章目录
- uni-app既支持vue的生命周期,也支持微信小程序的生命周期
- uni-app全局对象既可以是wx也可以是uni,并且rpx和upx是一样的效果
- 小程序是可以设置placeholder的样式的,但是h5却不可以
- uni-app是有默认样式的,这需要特别注意
- uni-app引入公共样式(css)和小程序引入公共样式(css)
- 假如在uni-app开启display后元素没有在一行排列
- nodejs模块的引入是怎么引入的,和es6又有什么区别
- nodejs的fs.readFileSync
- 设置文本超出二行隐藏
- 关于flex布局justify-content:space-around最后一个不对齐的解决方法和为什么这样子解决是讨论
- axios在某些小程序上用不了,可以用flyio模块
- 为什么使用jwt加密还可以解密出来
- v-if可以使用template进行包裹,外面套一层,这样子渲染就不会多出一层div了
- 图片的alt和title
- 更改this的执行的方法
- 使用reduce却莫名其妙返回一个undefined或者NaN
- 除了mapState需要手动指明返回什么,其他的mapGetters,mapActions,mapMutations都可以直接写数组(但是开启命名空间后情况是否是这样子不知道)
- fly请求微信的code2Session对返回的结果取data项返回的是字符串,而不是对象
- 当我们修改state当中新添加字段数据的时候,注意修改为响应式数据
- es6简写需要注意
- node引入json,自动转换为原生的对象了
- 其他一些小知识点
uni-app既支持vue的生命周期,也支持微信小程序的生命周期
- 也就是我们可以这样子写
<script>
export default {
onLoad:function(){
//...
},
onShow: function() {
//...
},
onHide: function() {
//...
},
mounted(){
//...
},
}
</script>
- 所以我们在
uni-app
路由跳转的时候,除了使用vue-router
去跳转和接收参数,我们还可以使用小程序自带的路由跳转和接收参数,比如说wx.navigateTo
去进行跳转并在onLoad
去接收传递过来的参数(比如query
参数) - 比如说单击商品图片跳转到商品详情,就可以这样子做,示例如下
methods:{
//跳转到商品详情页
checkDetail(shopItem){
wx.navigateTo({
url:"/pages/detail/detail?shopitem="+JSON.stringify(shopItem),
})
},
},
那么在商品详情组件就可以这样子接收,通过生命周期onLoad
onLoad(options){
//接收传递过来的参数
let shopItem = options.shopitem;
//参数存在才解析
if(shopItem){
this.shopDetail = JSON.parse(shopItem);
}
},
uni-app全局对象既可以是wx也可以是uni,并且rpx和upx是一样的效果
- 看个人习惯吧,其实个人从心理上认为全局对象
uni
比wx
兼容性会更好一点在编译的时候
小程序是可以设置placeholder的样式的,但是h5却不可以
-
主要是通过以下二个属性设置的
placeholder-class
:指定 placeholder 的样式类,注意页面或组件的style中写了scoped时,需要在类名前写/deep/- 字节跳动小程序、飞书小程序、快手小程序不支持
placeholder-style
:指定 placeholder 的样式
-
示例
<input class="search-input" placeholder="搜索内容在这里" placeholder-class="search-placeholder">
- 设置的样式
- 注意层级关系
/* 多级别下与input是同级的 */
.search-input .search-placeholder{
background-color: red;
}
/* 或者直接不通过层级 */
.search-placeholder{
font-size: 25rpx;
color: red;
}
uni-app是有默认样式的,这需要特别注意
- 比如我们写了一个标签
<button></button>
- 我们打开小程序调试查看,可以看到设置了这么多默认样式,所以我们在设置自己的样式的时候,需要注意默认样式对我们的影响
button {
-webkit-tap-highlight-color: transparent;
background-color: #f8f8f8;
border-radius: 5px;
box-sizing: border-box;
color: #000;
cursor: pointer;
display: block;
font-size: 18px;
line-height: 2.55555556;
margin-left: auto;
margin-right: auto;
overflow: hidden;
padding-left: 14px;
padding-right: 14px;
position: relative;
text-align: center;
text-decoration: none;
}
uni-app引入公共样式(css)和小程序引入公共样式(css)
- uni-app是在
App.vue
当中去引入- 注意,这里需要引入的格式是
@import url("地址")
- 示例代码如下
//App.vue
<script>
export default {
onLaunch: function() {
console.log('App Launch')
},
onShow: function() {
console.log('App Show')
},
onHide: function() {
console.log('App Hide')
}
}
</script>
<style lang="stylus">
/*每个页面公共css */
/* 引入iconfont字体图标*/
@import url("static/iconfont/iconfont.styl");
page
width 100%
height 100%
</style>
- 微信小程序引入公共样式
- 注意,这里引入是
@import "地址"
- 示例代码如下引入公共样式在微信小程序当中
@import './common/main.wxss';
假如在uni-app开启display后元素没有在一行排列
- 可以试试看设置下面这二个样式
white-space:nowrap
:设置元素不换行display:inline-block
:设置元素和行内块元素(目的是让元素不单独占据一行)
nodejs模块的引入是怎么引入的,和es6又有什么区别
- 这里只记录了下简单的,新遇到的问题,具体想看es6的暴露和引入的具体的,可以看我之前写的文章,@地址
es6
引入
- es6的引入需要在模块的最前面,不可以出现如下代码(使用静态的import会出现的问题)
import a from "./a.js"
function getNumber(){
import b from "./b.js";
}
否者出现就会报错,提示导入声明只能在模块的顶层使用
- 那是因为你使用了静态的import,标准用法的 import 导入的模块是静态的,会使所有被导入的模块,在加载时就被编译(无法做到按需编译,降低首页加载速度)。有些场景中,你可能希望根据条件导入模块或者按需导入模块,这时你可以使用动态导入代替静态导入。
- 在vue路由的时候,经常使用这种动态的导入方法
import('/modules/my-module.js')
.then((module) => {
// Do something with the module.
});
//这种使用方式也支持 await 关键字。
async function getNumber(){
const b = await import("./b.js");
console.log(b);
}
getNumber();
暴露
- es6的暴露出去的都是对象
- 在引入的时候除了默认暴露,其他的基本上都需要解构赋值才可以
nodejs
引入
- nodejs是commojs的规范,他可以在使用到的时候再引入
- 比如下面有一个需求,就是是当用户请求某一个路由的时候,我才去读取数据并返回给用户,这个时候就可以体现出nodejs引入的好处了,是代码执行到这一段的时候才去引入
// 分类页
router.get("/getCategoryData",(ctx)=>{
//读取分类页数据,代码执行到这一行才开始引入
const categoryData = require("../datas/categoryDatas.json");
ctx.body = categoryData
})
暴露
-
node提供了二种暴露方式
module.exports
exports
-
不想看下面的可以记住这句话就可以,不要使用exports去暴露,使用
module.exports
去暴露 -
exports
是module.exports
是一个引用- 当通过exports去改变内存块里内容时,module.exports的值也会改变
- 当通过module.exports去改变内存块里内容时,exports的值也会改变
- 当module.exports所指向的地址被改变的时候,exports不会被改变
- 当exports所指向的地址被改变的时候,module.exports不会被改变
-
node的暴露可以简单理解为暴露什么,引入的就是什么
暴露引入如下-暴露什么,引入的就是什么
nodejs的fs.readFileSync
-
在没有指明编码方式的情况下,默认是
Buffer
-
官方解释
If the encoding option is specified then this function returns a string. Otherwise it returns a buffer.
- 示例代码,未指明的时候为
buffer
流,指明了则为字符串
const fs = require("fs");
const path = require("path");
// 指明数据类型
var result = fs.readFileSync(path.resolve(__dirname,"data/test.json"),"utf-8");
console.log(result);
console.log(typeof result); //类型为字符串
//未指明数据类型
var result = fs.readFileSync(path.resolve(__dirname,"data/test.json"));
console.log(result);
console.log(typeof result);
设置文本超出二行隐藏
.show {
width: 200px;
text-overflow: ellipsis;
overflow: hidden;
display: -webkit-box;
-webkit-box-orient: vertical;
/* 设置超出几行省略 */
-webkit-line-clamp: 2;
}
关于flex布局justify-content:space-around最后一个不对齐的解决方法和为什么这样子解决是讨论
-
参考文章
-
大家可能都遇到过下面这种情况,在布局的时候我们不得不设置
justify-content:space-around
并且效果本来想是下面这张图右边的效果,但是显示的却是左边的效果了
-
其实解决也很简单,在最外层添加一个伪类即可
html结构
<!-- 外层 --> <div class="root"> <!-- 遍历数据的 --> <div v-for="(shopItem, index) in shopList" :key="index"> <img style="width: 200px;" :src="shopItem.url" alt="" /> </div> </div>
css解决办法,在root后面添加一个伪类即可解决
.root::after{ content: ""; width: 200px; /* 不可以提供高度 */ /* height: 200px; */ }
那么为什么设置::after伪类就可以解决呢justify-content所带来的布局问题呢?
- 当那个循环列表是奇数的时候会出现那个填充框框对吧?
- 但是如果是偶数会不会出现这个伪类
::after
的填充框呢,我们再添加一个项目框框- 可以看到,并没有出现这个红色框框(不是我截图没有截到,是真的没有出现红色框框)
CSS伪元素::after用来创建一个伪元素,作为已选中元素的最后一个子元素。通常会配合content属性来为该元素添加装饰内容。这个虚拟元素默认是行内元素。
- 那么肯定不是盒子模型计算的问题了,那么是为什么呢?(下面推断个人想法,可能有误)
- 后面想了想出现这种情况是什么
- 1.最后一行没有被填充,有空隙的时候,就会出现伪类的填充
- 2.当容器最后没有留空的时候,就不会出现伪类的填充
- 后面想了想出现这种情况是什么
- 后面查看弹性盒属性,发现了
flex-basis
CSS 属性 flex-basis 指定了 flex 元素在主轴方向上的初始大小。如果不使用
box-sizing
改变盒模型的话,那么这个属性就决定了 flex 元素的内容盒(content-box)的尺寸。flex-basis 默认值为
auto
- 于是我设置伪类
::after
的flex-basis:0
,看看会发生什么,
.root::after{
content: "";
width: 200px;
/* 不可以提供高度 */
/* height: 200px; */
background: red;
flex-basis:0;
}
- 可以看到,伪类
::after
高度都没有,不像前面的一行没有满的情况有填充出现
- 我们在将他设置为
flex-basis:auto
看看会发生什么
- 当然,由于我们没有设置基础的宽度,所以设置
flex-basis:content
也是一样的效果
- 甚至设置
height:auto
是也一样的效果
flex-basis官方解释—由于最初规范中没有包括这个值,在一些早期的浏览器实现的 flex 布局中,content 值无效,可以利用设置 (width 或 height) 为 auto 达到同样的效果。
总结
- 浏览器知道我们需要这个填充内容出现是因为
flex-basis
默认值为auto,由浏览器为元素计算并选择一个高度或者宽度,当然,假如事先设置了宽度和高度,那么flex-basis:auto
是没有用的(这里是没有设置height,所以只讨论height的情况) - 所以要多了解了解flex布局呀~~~
axios在某些小程序上用不了,可以用flyio模块
- github地址:https://github.com/wendux/fly
- npm地址:https://www.npmjs.com/package/flyio
为什么使用jwt加密还可以解密出来
- 还可以使用https://jwt.io/解密出来
- 因为jwt不在于加密数据,而在于数据认证
- jsonwebtoken⽬的不在加密保护数据,⽽是为了认证来源,认证来源,认证来源。JWT不保证数据不泄
露,因为JWT的设计⽬的就不是数据加密和保护。
v-if可以使用template进行包裹,外面套一层,这样子渲染就不会多出一层div了
图片的alt和title
alt
- 网络错误、内容被屏蔽或链接过期时,会显示
alt
属性中的文本
- 网络错误、内容被屏蔽或链接过期时,会显示
title
- 鼠标悬停时候的提示信息
- title 属性不是
alt
属性可接受的替代品。并且,避免将alt
属性的值直接复制到同一幅图片的title
属性上。这样可能会让一些屏幕阅读器把同一段描述读两遍,造成一定程度上的困扰。
更改this的执行的方法
假设有一个函数fn需要改变this执行,要怎么做
- call,apply,bind方法作用
- 让任意的函数,成为对象的方法,从而改变this的指向
call方法
-
fn.call(this的指向,参数1,参数2,参数3,…)
function Product(name, price) { this.name = name; this.price = price; } function Food(name, price) { Product.call(this, name, price); this.category = 'food'; } //等同于,至于为什么等于 //这就要涉及到创建一个构造函数的时候究竟做了什么 //创建构造函数其实就是在this(新实例化对象上)上添加赋值并返回这个this //所以你看构造函数都没有返回值,那是因为系统自动添加了返回值 //自动添加了return this function Food(name, price) { this.name = name; this.price = price; this.category = 'food'; } console.log(new Food('cheese', 5).name); // expected output: "cheese"
-
备注:该方法的语法和作用与
apply()
方法类似,只有一个区别,就是call()
方法接受的是一个参数列表,而apply()
方法接受的是一个包含多个参数的数组。
语法
function.call(thisArg, arg1, arg2, ...)
参数
thisArg
- 可选的。在
function
函数运行时使用的this
值。请注意,this
可能不是该方法看到的实际值:如果这个函数处于非严格模式下,则指定为null
或undefined
时会自动替换为指向全局对象,原始值会被包装。
arg1, arg2, ...
- 指定的参数列表
apply方法
- @mdnwebDoc - apply
- fn.apply(this的指向,[参数1,参数2,参数3,…])
语法
apply(thisArg)
apply(thisArg, argsArray)
参数说明
thisArg
- 在
func
函数运行时使用的this
值。请注意,this
可能不是该方法看到的实际值:如果这个函数处于非严格模式下,则指定为null
或undefined
时会自动替换为指向全局对象,原始值会被包装。
argsArray
- 一个数组或者类数组对象,其中的数组元素将作为单独的参数传给
func
函数。如果该参数的值为null
或undefined
,则表示不需要传入任何参数。从 ECMAScript 5 开始可以使用类数组对象。浏览器兼容性请参阅本文底部内容。
bind方法
-
fn.bind(this的指向,[参数1,参数2,…])
const module = { x: 42, getX: function() { return this.x; } }; const unboundGetX = module.getX; console.log(unboundGetX()); //里面的this指向window //window里面没有x变量,所以返回undefined //更改this的执行,返回一个函数,并赋值给boundGetX const boundGetX = unboundGetX.bind(module); //执行更改this后的函数 console.log(boundGetX());//输出42
-
bind()
方法创建一个新的函数,在bind()
被调用时,这个新函数的this
被指定为bind()
的第一个参数,而其余参数将作为新函数的参数,供调用时使用。
语法
参数
thisArg
- 调用绑定函数时作为
this
参数传递给目标函数的值。 如果使用new
运算符构造绑定函数,则忽略该值。当使用bind
在setTimeout
中创建一个函数(作为回调提供)时,作为thisArg
传递的任何原始值都将转换为object
。如果bind
函数的参数列表为空,或者thisArg
是null
或undefined
,执行作用域的this
将被视为新函数的thisArg
。
arg1, arg2, ...
- 当目标函数被调用时,被预置入绑定函数的参数列表中的参数。
使用reduce却莫名其妙返回一个undefined或者NaN
- @webdoc-reduce
- 需要特别注意
- 1.当没有传入初始值的时候,就以第一个item为初始值,也就是索引为0的item项为初始值
- 2.每一次循环遍历必须要返回上一次的计算结果(也就是必须要return一个值,不return就会返回
undefined
从而出现NaN
)并将这个返回结果作为下一次的初始化值
代码示例-没有做到每次都返回值
- 本来是想计算大于8的值的所有数的合,但是却返回了NaN
const array1 = [1, 10, 2, 3, 4, 5, 8, 10];
const initialValue = 0;
let result = array1.reduce((prev, item) => {
if (item >= 8) {
return (prev += item);
}
}, 0);
//返回NaN
console.log("相加结果", result);
正确代码如下 - 做到了每一次都有返回值
const array1 = [1, 10, 2, 3, 4, 5, 8, 10];
const initialValue = 0;
let result = array1.reduce((prev, item) => {
if (item >= 8) {
return (prev += item);
} else {
return prev;
}
}, 0);
//输出28
console.log("相加结果", result);
//或者你可以写的更简单一点
const array1 = [1, 10, 2, 3, 4, 5, 8, 10];
const initialValue = 0;
let result = array1.reduce((prev, item) => {
return (prev += item >= 8 ? item : 0);
}, 0);
//输出28
console.log("相加结果", result);
除了mapState需要手动指明返回什么,其他的mapGetters,mapActions,mapMutations都可以直接写数组(但是开启命名空间后情况是否是这样子不知道)
- 比如mapState
computed:{
//映射vuex当中数据 - 开启了模块化
...mapState({
indexData: state => state.home.indexData,
}),
//映射vuex当中数据 - 没有开启模块化
...mapState({
indexData: state => state.indexData,
})
//也可以这样子 - 没有开启模块化
//当映射的计算属性的名称与 state 的子节点名称相同时,我们也可以给 mapState 传一个字符串数组。
//映射 this.count 为 store.state.count
...mapState(["count"])s
},
fly请求微信的code2Session对返回的结果取data项返回的是字符串,而不是对象
- fly请求微信的code2Session对返回的结果取data项返回的是字符串,而不是对象,我们必须手动去转换下才可以转化为JSON对象,而axios的则不用
let result = await fly.get("https://api.weixin.qq.com/sns/jscode2session", {
appid,
secret,
js_code,
grant_type: "authorization_code",
});
console.log(result.data);
console.log("fly时候返回的结果",typeof result.data);
- 注意的是,
axios
模块在小程序是用不了的,因为因为axios
是基于window身上的XMLHttpRequest
的,使用如果想在小程序中使用,可以试试看fly库
当我们修改state当中新添加字段数据的时候,注意修改为响应式数据
- 比如通过
this.$set
或者Vue.set
es6简写需要注意
- es6对象可以简写是
key
值和变量是一样的名字才可以简写
<script>
let name = "李白"
let obj = {
name,
}
console.log(obj);//{name: "李白"}
</script>
- 这种情况就不能省略,因为后面是字符串
node引入json,自动转换为原生的对象了
- 如果是在CommonJS模块中加载json文件,只需通过require()函数直接加载即可,即能得到json对象
其他一些小知识点
-
text-align
:可以设置图片也可以设置文本,也就是设置内联样式的 -
图片默认基线对其的,
-
除了mapState需要手动指明返回什么,其他的mapGetters,mapActions,mapMutations都可以直接写数组(但是开启命名空间后情况是否是这样子不知道)
-
伪元素是针对元素的一部分内容来设置的,比如说
::after
-
而伪类是针对整个元素来设置的,比如说
:hover
更多推荐
所有评论(0)