你為什么要?jiǎng)討B(tài)生成dom節(jié)點(diǎn)呢,Vue沒(méi)法直接監(jiān)測(cè)??!
你寫成“條件編譯”吧,使用v-if指令來(lái)根據(jù)實(shí)際需要渲染頁(yè)面,即把代碼寫進(jìn)HTML,根據(jù)實(shí)際運(yùn)行情況通過(guò)v-if指令告知Vue渲染指定元素節(jié)點(diǎn)
請(qǐng)記住,變化的是數(shù)據(jù),不變的是邏輯,這才是Vue的設(shè)計(jì)理念:MVVM!
變化的數(shù)據(jù)驅(qū)動(dòng)邏輯代碼,邏輯代碼來(lái)展現(xiàn)功能。
只要邏輯代碼能正確處理幾乎所有的數(shù)據(jù),那么這個(gè)軟件就不會(huì)有明顯影響使用的bug。
不知道我跟你想的一不一樣,可以看下combineReducers的源碼:
var hasChanged = false
var nextState = {}
for (var i = 0; i < finalReducerKeys.length; i++) {
var key = finalReducerKeys[i]
var reducer = finalReducers[key]
var previousStateForKey = state[key]
var nextStateForKey = reducer(previousStateForKey, action)
if (typeof nextStateForKey === 'undefined') {
var errorMessage = getUndefinedStateErrorMessage(key, action)
throw new Error(errorMessage)
}
nextState[key] = nextStateForKey
hasChanged = hasChanged || nextStateForKey !== previousStateForKey
}
return hasChanged ? nextState : state
關(guān)鍵點(diǎn)在于每次reducer返回新的state會(huì)跟舊的state做===對(duì)比,如果false認(rèn)為store改變,從而觸發(fā)頁(yè)面重繪,如果true,則認(rèn)為不變,不會(huì)觸發(fā)重繪。所以reducer返回新的state是為了通知redux讓頁(yè)面重繪。
Object.getOwnPropertyDescriptor()只能訪問(wèn)自有屬性
用之前先看定義
使用 System.Web.HttpUtility.JavaScriptStringEncode() 方法
@using System.Web;
@HttpUtility.JavaScriptStringEncode(item.p_day);
ios安全方面做的比較好,點(diǎn)擊事件只有用戶觸摸才能觸發(fā),
.. 不太清楚你想干什么
沒(méi)用過(guò) bluebird, 大概看了下大多用在 nodejs 里面把 callback 轉(zhuǎn)變?yōu)?promise 化。你這里 box 的 run 方法連形參都沒(méi)有轉(zhuǎn)成 promise 又有什么意義呢。你發(fā)現(xiàn)了最后 then 不執(zhí)行,那你有沒(méi)有想過(guò) then 應(yīng)該什么時(shí)候去執(zhí)行呢。就算你是為了簡(jiǎn)單的實(shí)驗(yàn)一下 run 方法也應(yīng)該寫成你熟悉的異步模塊的函數(shù),至少有一個(gè)回掉函數(shù)吧
class Box{
constructor(name){
this.name = name;
}
run(cb){
console.log(this.name + ' is running')
cb(null) // null 代表沒(méi)有錯(cuò)誤
}
}
其實(shí)你可以自己嘗試一下這個(gè)庫(kù)要怎么把 callback 的函數(shù)轉(zhuǎn)變?yōu)?promise 對(duì)象,自己簡(jiǎn)單來(lái)寫可以會(huì)這樣
let box = new Box('ss')
let runAsync = (...args) => new Promise((r, j) => {
box.run.call(box, ...args, (err, data) => {
if (err) return j(err)
r(data)
})
})
runAsync().then(function(){
console.log('stop');
})
可以看到如果你最后一個(gè)回掉函數(shù)都沒(méi)有,生產(chǎn)的 promise 就跟本沒(méi)有觸發(fā)錯(cuò)誤或者成功的時(shí)機(jī)
type="text" data-bind = "lastName" type = "1"
兩個(gè)type那個(gè)說(shuō)了算?通過(guò)下面這個(gè)代碼我們可以發(fā)現(xiàn)attr獲取到的是text,效果觀看地址。而且你那種on(event, selector, fn)一般是用來(lái)綁在document上,也就是父級(jí)祖先級(jí)上,然后過(guò)濾觸發(fā)子節(jié)點(diǎn)的,文檔查看地址。
$('input').on('input',function(){
console.log($(this).attr('type'))
})
1.可以刪除目錄下的.vscode里面的launch.json文件,這樣在哪一個(gè)js文件里面按F5,你調(diào)試的就是哪一個(gè)js文件
2.如果你lanuch.json文件里面有些配置,或者其他問(wèn)題,那請(qǐng)改成下面的內(nèi)容
{
// 使用 IntelliSense 了解相關(guān)屬性。
// 懸停以查看現(xiàn)有屬性的描述。
// 欲了解更多信息,請(qǐng)?jiān)L問(wèn): https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "啟動(dòng)程序",
"program": "${workspaceFolder}/${relativeFile}"http://${relativeFile} 從當(dāng)前打開的文件夾到當(dāng)前打開的文件的路徑
}
]
}
removeEventListener 第二個(gè)參數(shù)傳的不對(duì)
@font-face {
font-family: 'RobotoRegular';
src: url('Roboto-Bold.eot'); /* IE9 Compat Modes */
src: url('Roboto-Bold.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
url('Roboto-Bold.woff') format('woff'), /*//Modern Browsers */
url('Roboto-Bold.ttf') format('truetype'), /* Safari, Android, iOS */
url('Roboto-Bold.svg#RobotoRegular') format('svg'); /* Legacy iOS */
}
@font-face {
font-family: 'RobotoRegular2';
src: url('Roboto-Regular.eot'); /* IE9 Compat Modes */
src: url('Roboto-Regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
url('Roboto-Regular.woff') format('woff'), /*//Modern Browsers */
url('Roboto-Regular.ttf') format('truetype'), /* Safari, Android, iOS */
url('Roboto-Regular.svg#RobotoRegular') format('svg'); /* Legacy iOS */
}設(shè)置image的mode為widthFix,然后寬度100%就成啦。就能自動(dòng)適應(yīng)圖片了
附官網(wǎng)說(shuō)明https://mp.weixin.qq.com/debu...
arr = fields.map(key => obj.map(o => o[key]))每次重新加載圖片的問(wèn)題。
<form action="javascript:return true;" autocomplete="off"> 這里的action不對(duì)吧。。javascript:后面要加語(yǔ)句,然后return是放在函數(shù)體中的,而不能在其他地方使用
eval('return true')
//Uncaught SyntaxError: Illegal return statement
// at <anonymous>:1:1
$(".bgimg").css({'background-image':'url(' + $('.img-box img').attr('src').substring(0,20) + ')"'});
async是generator的語(yǔ)法糖,但不是簡(jiǎn)單的替換就可以解決的
使用await語(yǔ)法自帶執(zhí)行器,而generator則是不帶執(zhí)行器,需要自己手工添加
await需要后面的變量是一個(gè)promise對(duì)象
給你個(gè)generator+promise對(duì) async/await的實(shí)現(xiàn)
//一個(gè)generator執(zhí)行器的實(shí)現(xiàn)
function run(generator){
var gen=generator();
var resultValue=gen.next();
if(resultValue.done){
return resultValue.value;
}
function runGenerator(value){
Promise.resolve(value).then(function(data){
var resultValue=gen.next(data);
if(!resultValue.done){
runGenerator(resultValue.value);
}
}).catch(function(error){
gen.throw(new Error(error));
});
}
return runGenerator(resultValue.value);
}
//執(zhí)行執(zhí)行器,
//傳入一個(gè)generator函數(shù),yield后面帶一個(gè)promise對(duì)象
run(function *(){
var task1=function(){
return new Promise(function(resolve,reject){
setTimeout(function(){
console.log("1000");
resolve("1000");
},1000);
});
};
var task2=function(data){
return new Promise(function(resolve,reject){
setTimeout(function(){
console.log("2000 :: "+data+"");
resolve("2000 :: "+data+"");
},1000);
});
};
try{
var data=yield task1();
var data2=yield task2(data);
return data2;
}catch(error){
console.log("~~~~error~~~");
}
});瀏覽器只會(huì)實(shí)現(xiàn)一部分特性
...可能是滾動(dòng)的太猛,scroll觸發(fā)多次,造成多次請(qǐng)求。設(shè)置個(gè)標(biāo)志位試試,每次請(qǐng)求前檢查標(biāo)志位,判斷是否正在請(qǐng)求,scroll加throttle函數(shù)。
1,更改devtool參數(shù),在index.js中
devtool: 'source-map',
這樣我們就能得到具體的錯(cuò)誤信息.
2,如果我們還使用了ES6中的API,比如Promise,它將不會(huì)得到IE瀏覽器的支持,所以我們需要引用 'babel-polyfill'
webpack.base.conf.js
entry: {
normal: ['babel-polyfill', './src/main.js']
},
main.js
import 'babel-polyfill';
3,引用插件是否已經(jīng)得到正確的編譯,我所使用到的插件,比如element-ui,vis等沒(méi)有得到正確的編譯,更改 'webpack.base.conf.js'文件
{
test: /\.js$/,
loader: 'babel-loader',
include: [resolve('src'), resolve('test'), resolve('/node_modules/element-ui/src')]
}
// 前提是你必須安裝對(duì)應(yīng)的工具依賴
{
test: /node_modules[\\\/]vis[\\\/].*\.js$/,
loader: 'babel-loader',
query: {
cacheDirectory: true,
presets: [ "babel-preset-es2015" ].map(require.resolve),
plugins: [
"transform-es3-property-literals", // #2452
"transform-es3-member-expression-literals", // #2566
"transform-runtime" // #2566
]
}
}
Node v8.11.3
npm v5.6.0
"dependencies": {
"axios": "^0.18.0",
"babel-preset-es2015": "^6.24.1",
"element-ui": "^2.4.5",
"js-cookie": "^2.2.0",
"lodash": "^4.17.10",
"md5": "^2.2.1",
"moment": "^2.22.2",
"vee-validate": "^2.1.0-beta.6",
"vue": "^2.5.2",
"vue-cookies": "^1.5.6",
"vue-iconfont": "^1.1.0",
"vue-router": "^3.0.1",
"vuex": "^3.0.1"
},
"devDependencies": {
"autoprefixer": "^7.1.2",
"babel-cli": "^6.26.0",
"babel-core": "^6.22.1",
"babel-helper-vue-jsx-merge-props": "^2.0.3",
"babel-loader": "^7.1.1",
"babel-plugin-component": "^1.1.1",
"babel-plugin-syntax-jsx": "^6.18.0",
"babel-plugin-transform-runtime": "^6.22.0",
"babel-plugin-transform-vue-jsx": "^3.5.0",
"babel-plugin-transform-es3-member-expression-literals": "^6.22.0",
"babel-plugin-transform-es3-property-literals": "^6.22.0",
"babel-polyfill": "^6.26.0",
"babel-preset-env": "^1.3.2",
"babel-preset-stage-2": "^6.22.0",
"chalk": "^2.0.1",
"copy-webpack-plugin": "^4.0.1",
"css-loader": "^0.28.11",
"extract-text-webpack-plugin": "^3.0.0",
"file-loader": "^1.1.4",
"friendly-errors-webpack-plugin": "^1.6.1",
"html-webpack-plugin": "^2.30.1",
"less": "^3.7.0",
"less-loader": "^4.1.0",
"node-notifier": "^5.1.2",
"node-sass": "^4.9.2",
"optimize-css-assets-webpack-plugin": "^3.2.0",
"ora": "^1.2.0",
"portfinder": "^1.0.13",
"postcss-import": "^11.0.0",
"postcss-loader": "^2.0.8",
"postcss-url": "^7.2.1",
"rimraf": "^2.6.0",
"sass-loader": "^7.0.3",
"semver": "^5.3.0",
"shelljs": "^0.7.6",
"style-loader": "^0.21.0",
"stylus": "^0.54.5",
"stylus-loader": "^3.0.2",
"uglifyjs-webpack-plugin": "^1.1.1",
"url-loader": "^0.5.8",
"vis": "^4.21.0",
"vue-loader": "^13.3.0",
"vue-style-loader": "^3.1.2",
"vue-template-compiler": "^2.5.2",
"webpack": "^3.6.0",
"webpack-bundle-analyzer": "^2.9.0",
"webpack-dev-server": "^2.7.1",
"webpack-merge": "^4.1.0"
},
謝謝 Nine 的幫助
算。
但是會(huì)來(lái)這里問(wèn)這樣一個(gè)問(wèn)題,說(shuō)明你對(duì)模塊化的真正奧義還不明白 - 使用前端組件來(lái)解決工程問(wèn)題,頂多只能算是摸著了模塊化的門檻,離掌握它的內(nèi)涵,尚有一段不算短的距離。
模塊化是軟件行業(yè)一個(gè)非常通用的概念。你沒(méi)有看錯(cuò),不只是前端,所有涉及到軟件的方面,都不能不提到模塊化。事實(shí)上,前端模塊化的概念大部分來(lái)自于后端,這也是為什么有一部分前端框架中引用了極多的后端名詞。
模塊化要解決的是軟件本身一定會(huì)越來(lái)越龐大這個(gè)無(wú)解的問(wèn)題。既然不能阻止它的體積膨脹,那就只能從物理上將它切分成更小但是更多的,可以內(nèi)部自治,對(duì)外提供服務(wù)的小單元。微服務(wù),組件化,模塊化,概念大同小異,核心價(jià)值訴求卻是想通的。
所以,模塊化的最核心的優(yōu)勢(shì)是,大事化小。降低復(fù)雜度,提供可復(fù)用,提高項(xiàng)目組的協(xié)作能力,這些都是副產(chǎn)品,但卻是最為大家津津樂(lè)道的東西。
以上純屬個(gè)人理解,談不上真理更算不上奧義。因?yàn)槲乙恢闭J(rèn)為,領(lǐng)悟軟件開發(fā)中最核心的東西,永遠(yuǎn)需要身體力行,親自實(shí)踐。
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國(guó)IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國(guó)家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國(guó)一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國(guó)成功上市,融資1
北大課工場(chǎng)是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國(guó)家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國(guó)制造2025”,實(shí)現(xiàn)中華民族偉大復(fù)興的升級(jí)產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國(guó)職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫(kù),具有快速界面開發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁(yè)制作和網(wǎng)頁(yè)游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國(guó)Software AG 技術(shù)顧問(wèn),美國(guó)Dachieve 系統(tǒng)架構(gòu)師,美國(guó)AngelEngineers Inc. 系統(tǒng)架構(gòu)師。