uni-app 是一個使用 Vue.js 開發跨平臺應用的前端框架。javascript
開發者經過編寫 Vue.js 代碼,uni-app 將其編譯到iOS、Android、微信小程序、H5等多個平臺,保證其正確運行並達到優秀體驗。
css
<template> <view class="content"> </view> </template> <script> export default { data: { } } </script>
methods: { openinfo() { var newsid = e.currentsTarget.dataset.newsid; uni.navigateTo({ url: '../info/info?newsid='+newsid }) } }
export defaults { onLoad: function(e){ uni.request({ url: ''+e.newsid, method: 'GET', data: {}, success: res => { } fail: () => {}, complete: () => {} }) } }
<template> <view class="content"> <view class="title"></view> </view> </template> <rich-text class="richTest" :nodes="strings"></rich-text>
返回數據格式
post_id 新聞id
title 標題
created_at 建立時間
author_avatar 圖標html
詳情
地址:前端
https://unidemo.dcloud.net.cn/api/news/36kr/ + id
使用rich-text來展現新聞內容vue
<rich-text class="richText" :nodes="strings"></rich-text>
2018年,uni-app,Dcloud推出uni-app,下載了官方提供的hello示例教程java
空白的項目要拷貝uni.css和uni.js,保存到common目錄
打開pages.json將文件中的navigationBarTitleTextnode
v-for表示要循環的語句
@tap表示綁定點擊事件
:data-postid表示綁定一個動態的數據
而postid表示這個動態的數據屬性是這個名字web
編寫js代碼的時候,編譯器會自動用eslint對代碼進行檢查
onLoad是頁面的生命週期ajax
<template> <view class="content"> <view class="uni-list"> <view class="uni-list-cell" hover-class="uni-list-cell-hover" v-for="(item,index) in news" :key="index" @tap="opennews" :data-postid="item.post_id"> <view class="uni-media-list"> <image class="uni-media-list-logo" :src="item.author_avatar"></image> <view class="uni-media-list-body"> <view class="uni-media-list-text-top">{{item.title}}</view> <view class="uni-media-list-text-bottom uni-ellipsis">{{item.created_at}}</view> </view> </view> </view> </view> </view> </template> <script> export default { data() { return { news: [] }; }, onLoad: function() { uni.request({ url: 'https://', method: 'GET', data: {}, success: res => { this.news = res.data; }, fail: () => {}, complete: () => {} }); }, methods: { opennews(e){ uni.navigateTo({ url: '../news/new?postid='+e.currentTarget.dataset.postid }); } } } </script> <style> .uni-media-list-body{height:auto;} .uni-media-list-text-top{line-height: 1.6em;} </style>
<template> <view class="wrap"> <view class="title"> {{title}} </view> <view class="content"> <rich-text :nodes="content"></rich-text> </view> </view> </template> <script> export default { data() { return { title: '', content: '' }; }, onLoad:function(e){ uni.request({ url: 'https://'+ e.postid, method: 'GET', data: {}, success: res => { this.title = res.data.title; this.content = res.data.content; }, fail: () => {}, complete: () => {} }); } } </script> <style> .wrap{padding: 10upx 2%;width: 96%;flex-wrap: wrap;} .title{line-height: 2em;font-weight: bold;font-size: 40upx;} .content{line-height: 2em;} </style>
網頁大可能是b/s
服務端代碼混合在頁面裏
如今是c/sjson
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> <script type="text/javascript"> </script> <style type="text/css"> </style> </head> <body> </body> </html>
<template> <view> </view> </template> <script> export default { } </script> <style> </style>
<script> var util = require('../../../common/util.js'); //require這個js模塊 var formatedPlayTime = util.formatTime(playTime); //調用js模塊的方法 </script>
function formatTime(time) { return time;//這裏沒寫邏輯 } module.exports = { formatTime: formatTime }
var dateUtils = require('../../../common/util.js').dateUtils; import * as echarts from '/components/echarts.simple.min.js';
<style> @import "./common/uni.css"; .uni-hello-text { color: #7A7E83; } </style>
導入一個角標的組件庫
<template> <view> <uni-badge text="abc" :inverted="true"></uni-badge> </view> </template> <script> import uniBadge from '../../../components/uni-badge.vue"; export default { data() { return { } }, components: { uniBadge } } </script>
// main.js import pageHead from './components/page-head.vue' // 導入 Vue.component('page-head', pageHead)
div改view
span, font 改 text
a 改爲 navigator
img 改 image
input, form, button, checkbox, radio, label, textarea, canvas, video
select 改 picker
iframe 改 web-view
scroll-view
swiper
icon
rich-text
progress
slider
switch
camera
live-player
map
cover-view
覆蓋原生組件,在map上加個遮罩,則須要使用cover-view組件
js變化,分爲運行環境變化,數據綁定模式變化,api
瀏覽器中的js是w3c組織基於js規範補充了window、document、navigator、location等專用對象。
<html> <head> <script type="text/javascript"> document.addEventListener("DOMContentLoaded",function(){ document.getElementById("spana").innerText="456" }) function changtextvalue() { document.getElementById("spana").innerText="789" } </script> </head> <body> <span id="spana">123</span> <button type="button onclick="changetextvalue()">111</button> </body> </html>
<template> <view> <text>{{textvalue}}</text> <button :type="buttontype" @click="changetextvalue()"></button> </view> </template> <script> export default{ data() { return { textvalue: "123", buttontype: "primary" }; }, onLoad() { this.textvalue="456" }, methods: { changetextvalue() { this.textvalue="789" } } } </script>
alert, confirm改爲 uni.showmodel
ajax 改爲 uni.request
cookie, session,
rem只能用於h5
注意背景圖和字體文件儘可能不要大於40k。
小程序生命週期
onLoad: 頁面加載
一個頁面只會調用一次,在onLoad中獲取打開當前也邁進所調用的query參數
onShow頁面顯示
每次打開頁面都會調用一次
onReady: 頁面初次渲染完成
一個頁面只會調用一次,表明頁面已經準備穩當,能夠和視圖層進行交互
onHide: 頁面隱藏
當navigateTo或底部tab切換時調用
onUnload: 頁面卸載
當redirectTo或navigateBack的時候調用
vue通常會在created或者mounted中請求數據
在小程序,會在onLoad或者onShow中請求數據
<img :src="imgSrc"/> <image src="{{imgSrc}}"></image>
VUE <img :src="imgSrc"/> 小程序 <image src="{{imgSrc}}"></image>
<ul id="example-1"> <li v-for="item in items"> {{ item.message }} </li> </ul> var example1 = new Vue({ el: '#example-1', data: { items: [ { message: 'Foo' }, { message: 'Bar' } ] } })
<ul id="example-1"> <li v-for="item in items"> {{ item.message }} </li> </ul> var example1 = new Vue({ el: '#example-1', data: { items: [ { message: 'Foo' }, { message: 'Bar' } ] } })
顯示與隱藏元素
vue中,使用v-if 和v-show控制元素的顯示和隱藏
小程序中,使用wx-if和hidden控制元素的顯示和隱藏
<button v-on:click="counter += 1">Add 1</button> <button v-on:click.stop="counter+=1">Add1</button> //阻止事件冒泡
<button bindtap="noWork">明天不上班</button> <button catchtap="noWork">明天不上班</button> //阻止事件冒泡
<div id="app"> <input v-model="reason" placeholder="填寫理由" class='reason'/> </div> new Vue({ el: '#app', data: { reason:'' } })
<div id="app"> <input v-model="reason" placeholder="填寫理由" class='reason'/> </div> new Vue({ el: '#app', data: { reason:'' } })
<div id="app"> <input v-model="reason" placeholder="填寫理由" class='reason'/> </div> new Vue({ el: '#app', data: { reason:'' } })
vue中,經過this.reason取值
小程序中,經過this.data.reason取值
<button @click="say('明天不上班')"></button> new Vue({ el: '#app', methods:{ say(arg){ consloe.log(arg) } } })
經過e.currentTarget.dataset.*的方式獲取
<view class='tr' bindtap='toApprove' data-id="{{item.id}}"></view> Page({ data:{ reason:'' }, toApprove(e) { let id = e.currentTarget.dataset.id; } })
//子組件 bar.vue <template> <div class="search-box"> <div @click="say" :title="title" class="icon-dismiss"></div> </div> </template> <script> export default{ props:{ title:{ type:String, default:'' } } }, methods:{ say(){ console.log('明天不上班'); this.$emit('helloWorld') } } </script> // 父組件 foo.vue <template> <div class="container"> <bar :title="title" @helloWorld="helloWorld"></bar> </div> </template> <script> import Bar from './bar.vue' export default{ data(){ return{ title:"我是標題" } }, methods:{ helloWorld(){ console.log('我接收到子組件傳遞的事件了') } }, components:{ Bar } </script>
{ "component": true }
"usingComponents": { "tab-bar": "../../components/tabBar/tabBar" } <tab-bar currentpage="index"></tab-bar>
//子組件 bar.vue <template> <div class="search-box"> <div @click="say" :title="title" class="icon-dismiss"></div> </div> </template> <script> export default{ props:{ title:{ type:String, default:'' } } }, methods:{ say(){ console.log('明天不上班'); this.$emit('helloWorld') } } </script> // 父組件 foo.vue <template> <div class="container"> <bar :title="title" @helloWorld="helloWorld"></bar> </div> </template> <script> import Bar from './bar.vue' export default{ data(){ return{ title:"我是標題" } }, methods:{ helloWorld(){ console.log('我接收到子組件傳遞的事件了') } }, components:{ Bar } </script>
//子組件 bar.vue <template> <div class="search-box"> <div @click="say" :title="title" class="icon-dismiss"></div> </div> </template> <script> export default{ props:{ title:{ type:String, default:'' } } }, methods:{ say(){ console.log('明天不上班'); this.$emit('helloWorld') } } </script> // 父組件 foo.vue <template> <div class="container"> <bar :title="title" @helloWorld="helloWorld"></bar> </div> </template> <script> import Bar from './bar.vue' export default{ data(){ return{ title:"我是標題" } }, methods:{ helloWorld(){ console.log('我接收到子組件傳遞的事件了') } }, components:{ Bar } </script>
// 父組件 foo.vue <template> <div class="container"> <bar :title="title"></bar> </div> </template> <script> import Bar from './bar.vue' export default{ data(){ return{ title:"我是標題" } }, components:{ Bar } </script> // 子組件bar.vue <template> <div class="search-box"> <div :title="title" ></div> </div> </template> <script> export default{ props:{ title:{ type:String, default:'' } } } </script>
properties: { // 彈窗標題 currentpage: { // 屬性名 type: String, // 類型(必填),目前接受的類型包括:String, Number, Boolean, Object, Array, null(表示任意類型) value: 'index' // 屬性初始值(可選),若是未指定則會根據類型選擇一個 } } //子組件中 methods: { // 傳遞給父組件 cancelBut: function (e) { var that = this; var myEventDetail = { pickerShow: false, type: 'cancel' } // detail對象,提供給事件監聽函數 this.triggerEvent('myevent', myEventDetail) //myevent自定義名稱事件,父組件中使用 }, } //父組件中 <bar bind:myevent="toggleToast"></bar> // 獲取子組件信息 toggleToast(e){ console.log(e.detail) }
若本號內容有作得不到位的地方(好比:涉及版權或其餘問題),請及時聯繫咱們進行整改便可,會在第一時間進行處理。
這是一個有質量,有態度的博客