1、首先:
renderjs是一个运行在视图层的js。它比WXS更加强大。它只支持app–vue和web。
turn.js官网在这里: Turn.js: The page flip effect in HTML5
如果只是单纯的H5端引入turnjs,是不需要用renderjs的,但是我的项目因为是在app端,就得用到renderjs
我们可以这样理解,uniapp是一个大圆,renderjs就是大圆中的小圆,那么turnjs就住在这个小圆里,我们把这个小圆叫做视图层,大圆叫做逻辑层
2.1、第一步先确定renderjs和uniapp的数据通信方式,完成了数据通信,才可以针对turnjs的配置项,做些uniapp自己的逻辑层的操作。
<view class="flipbook-viewport"
:rect="rect"
:change:rect="updateRenderData"
>
<view class="container" >
<view class="flipbook" id="flipbook" >
------------
</view>
</view>
</view>
rect是逻辑层对应的属性或者方法,当值改变时,就会触发视图层对应的逻辑操作。rect可以改成自己任意名字,逻辑操作的名字也可以改成自己任意的,可成对添加多个。
这部分操作必须在dom上绑定相应的主动触发事件,比如,touchend、click才可以触发,例如:
<view class="flipbook-viewport"
:rect="rect"
:change:rect="updateRenderData"
@touchend="turnjs.onClick"
>
<view class="container" >
<view class="flipbook" id="flipbook" >
<div class='hard'></div>
</view>
</view>
</view>
<script> // 逻辑层的js
import '@/utils/jquery.min.1.7.js';
import turn from '@/utils/turn.js';
export default {
computed: {
rect() {
return {
width: this.width,
height: this.height
}
}
},
methods:{
// 接收renderjs发回的数据
onViewClick(options) {
console.log('renderjsCall回调');
console.log(options);
},
}
}
</script>
<script lang="renderjs" module="turnjs">
// 视图层的js
import '@/utils/jquery.min.1.7.js';
import turn from '@/utils/turn.js';
export default {
data() {
return {
width: '',
height: ''
}
},
mounted() {
this.onTurn();
},
methods: {
onClick(event, ownerInstance) {
// 操作内容
ownerInstance.callMethod('onViewClick', {
curpage: 0
})
},
onTurn() {
$("#flipbook").turn({
autoCenter: true,
display: 'single',
height: this.height,
width: this.width,
elevation: 50,
duration:500,
gradients: true,
when: {
turning: function(event, page, pageObject) {
// 翻页时
}, }
});
}
}
}
</script>
通过@touchend=”turnjs.onClick 来主动发起视图层的逻辑,然后逻辑内部通过ownerInstance.callMethod传递数据到逻辑层,“onViewClick”,就是逻辑层内接收数据的函数,然后进行一系列的操作就好了。
3、说一下turnjs的注意事项,官方的css样式贴出来,我的项目中,引入情况不生效,所以就写到文件里了。
.flipbook-viewport{overflow:hidden;width:100%;height:100%;.container{display: flex;justify-content: center;align-items: center;margin: 0 auto;}.flipbook ::v-deep .page{background-color: white;background-repeat: no-repeat;background-size: 100% 100%;-webkit-box-shadow:0 0 20px rgba(0,0,0,0.2);-moz-box-shadow:0 0 20px rgba(0,0,0,0.2);-ms-box-shadow:0 0 20px rgba(0,0,0,0.2);-o-box-shadow:0 0 20px rgba(0,0,0,0.2);box-shadow:0 0 20px rgba(0,0,0,0.2);img {-webkit-touch-callout: none;-webkit-user-select: none;-khtml-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none;margin:0;}}.shadow{-webkit-transition: -webkit-box-shadow 0.5s;-moz-transition: -moz-box-shadow 0.5s;-o-transition: -webkit-box-shadow 0.5s;-ms-transition: -ms-box-shadow 0.5s;-webkit-box-shadow:0 0 20px #ccc;-moz-box-shadow:0 0 20px #ccc;-o-box-shadow:0 0 20px #ccc;-ms-box-shadow:0 0 20px #ccc;box-shadow:0 0 20px #ccc;}
}
同时我发现了一个现象,如果的page内容可以写死,那就简单太多,直接在常规的data里面定义数组,在dom中去渲染就好。page中的内容如果是动态的,会因为初始化的问题无法启动turn,所以我在最开始就添加了第一页的内容,保证能启动turnjs,应该是还有更好的办法,我没有想到。
<view class="flipbook" id="flipbook" >
<div class='hard'></div>
</view>
然后通过renderjs里面添加内容的监听,如果内容有改变,就添加页面
updateSimulationText(newVal, oldVal) { //renderjs里面的操作
$("#flipbook").turn('pages',1) // 内容变化时,保留1页
$("#flipbook").turn('pages',newVal.arr.length) // 添加数组长度的页数
for (var i=0; i<newVal.arr.length;i++) {
var tagHtml = "";
tagHtml = "<div></div>"; // 一个page的内容
if (!$("#flipbook").turn('hasPage', i+2)) {
// Create an element for this page
var element = $('<div />').html('');
// Add the page
$("#flipbook").turn('addPage', element, i+2);
element.html(tagHtml);
}
}
},
项目中的实际逻辑是,当turnjs翻页是,要通知逻辑层page+1,turnjs换章节时,要通知逻辑层获取指定章节的内容,但是通信的思路跟上面的提到的相同,就不再赘述了。
原文地址:https://blog.csdn.net/wh4834/article/details/129831844
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_45714.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!