Hancoson'blog

每天成长一点点


  • 首页

  • 分类

  • 关于

  • 归档

  • 标签

My frist Vue project

发表于 2017-06-12   |   分类于 笔记

介绍

Vuejs火了有一段时间了,但是之前自己还没有一个线上项目中使用它。刚搞公司前一段时间有个新项目要开发,再加上大BOSS那边要求使用Vuejs来做,自己也就毫不犹豫的接了下来,并用了Vuejs作为开发框架。那为什么要用它呢?有以下原有:

  • 易用/灵活/性能(哈哈~来自官网)
  • 对自身的技术面的拓展和提升
  • 后台项目,表单编辑比较多,很适合使用双向绑定的方式来控制data和view
  • 公司层面希望技术栈统一

过程

技术

1.构建工具

构建工具方面参考了尤大大的[vue-cli](https://github.com/vuejs/vue-cli)和vue-element-admin(https://github.com/PanJiaChen/vue-element-admin),当然也可以看看自己的小(DEOM)[https://github.com/Hancoson/vue-manage]。也基本都是copy第三方的,没有自己去造轮子。

2.技术栈

使用到的技术栈如下:
技术栈图

目录结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

├─index.html //页面入口
├─build //构建配置
├─config //构建配置文件
├─package.json
├─yarn.lock
├─README.md
└─src //资源目录
│ App.vue //vue入口
│ main.js //总入口文件
├─assets //静态资源目录
│ ├─img
│ ├─mock //mock数据
│ └─scss
├─components //组件目录
│ ├─common //公用组件
│ │ ├─home
│ │ │ home.vue
│ │ ├─layout
│ │ │ header.vue
│ │ └─……
│ └─pages //页面
│ ├─index
│ │ index.vue
│ └─……
├─router //路由
└─utils //工具函数

3.主要技术点分析

  • 路由:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    export default new Router({
    //mode: 'history',

    routes: [
    {
    path: '/',
    redirect: '/admin/index/carousel'
    }, {
    path: '/',
    component: resolve => require(['../components/common/home/home.vue'], resolve),
    children: [
    //首页
    {
    path: '/',
    component: resolve => require(['../components/pages/focus/Index.vue'], resolve)
    },
    ……
    ]
    }
    ]
    })
  • 数据流:
    数据流

    • 父组件到子组件,在父组件调用子组件时通过v-bind(:)绑定动态数据,在子组件,使用Prop方法(单项绑定,防止数据倒流)

      父:
      <edit-dialog :dialogData="dialogData" :rendom="new Date().getTime()"></edit-dialog>

      子:

      1
      2
      3
      4
      props: {
      dialogData: Object,
      rendom: Number
      }

      子组件中通过watch方法来监控数据是否改变,可触发相应的方法。

    • 子组件到父组件,在父组件中使用v-on(@)绑定自定义事件接收,在子组件中使用$emit来监控,并传给回掉。
      父:
      <edit-dialog @message="recieveMessage"></edit-dialog>

      子:

      1
      this.$emit('message', data)
    • 非父子组件,有时候两个组件也需要通信(非父子关系)。在简单的场景下,可以使用一个空的 Vue 实例作为中央事件总线:

      1
      var bus = new Vue()
      1
      2
      // 触发组件 A 中的事件
      bus.$emit('id-selected', 1)
      1
      2
      3
      4
      // 在组件 B 创建的钩子中监听事件
      bus.$on('id-selected', function (id) {
      // ...
      })

小结

乱七八糟的写了很多,也算是对这段时间用vue.js的一个回顾。不得不承认,在使用vue.js的过程当中开始逐渐喜欢上了这个优美而简洁的框架。因此也愿意跟更多的人分享使用它的经验。也欢迎大家一起交流。

记Chrome移动端浏览器渲染问题

发表于 2017-04-25   |   分类于 笔记

前一段时间在开发H5页面中遇到一个奇葩的问题,在Chrome浏览器中通过改变页面状态,在其他浏览器中测试是正常的,但是在Chrome中页面中按钮的背景色渲染不出来,先来看看问题到底长什么样:
问题重现
c

阅读全文 »

原生JS中 forEach 和 Map 区别

发表于 2017-04-02   |   分类于 笔记

最近看到关于数组遍历的东西,顺便总结一下 forEach() 和 map() 遍历数组方法的区别。这两个方法都是 ES5 中新增的,当然说到新增方法,不能不提它们的兼容性:IE 9+,哈哈……又是 IE。

阅读全文 »

移动端前端适配方案对比

发表于 2017-03-15   |   分类于 笔记

最近抽空看了看移动端适配的一些文章,也结合自己的经验做一下总结以及对比。

那么,开始正题,首先说说到目前位置出现的一些关于移动端适配的技术方案:

  • 通过媒体查询的方式即CSS3的meida queries
  • 以天猫首页为代表的 flex 弹性布局
  • 以淘宝首页为代表的 rem+viewport缩放
  • rem 方式

Meida Queries

meida queries 的方式可以说是我早期采用的布局方式,它主要是通过查询设备的宽度来执行不同的 css 代码,最终达到界面的配置。核心语法是:

1
2
3
@media screen and (max-width: 600px) { /*当屏幕尺寸小于600px时,应用下面的CSS样式*/
/*你的css代码*/
}

!Meida Queries

优点

  • media query可以做到设备像素比的判断,方法简单,成本低,特别是对移动和PC维护同一套代码的时候。目前像Bootstrap等框架使用这种方式布局
  • 图片便于修改,只需修改css文件
  • 调整屏幕宽度的时候不用刷新页面即可响应式展示

缺点

  • 代码量比较大,维护不方便
  • 为了兼顾大屏幕或高清设备,会造成其他设备资源浪费,特别是加载图片资源
  • 为了兼顾移动端和PC端各自响应式的展示效果,难免会损失各自特有的交互方式
阅读全文 »

flex布局中align-items 和align-content的区别

发表于 2017-03-09   |   分类于 笔记

最近看Flex弹性布局,觉得其中align-items和align-content很有用处,就做一下记录。

align-items

align-items 属性定义项目在交叉轴上如何对齐。

1
2
3
.box {
align-items: flex-start | flex-end | center | baseline | stretch;
}

!align-items

  • flex-start:交叉轴的起点对齐。
  • flex-end:交叉轴的终点对齐。
  • center:交叉轴的中点对齐。
  • baseline: 项目的第一行文字的基线对齐。
  • stretch(默认值):如果项目未设置高度或设为auto,将占满整个容器的高度。
阅读全文 »

经常会犯错的js作用域

发表于 2017-02-27   |   分类于 笔记

一下整理一些在js作用域知识中经常犯错的知识点:

1.

1
2
3
4
5
6
var a = 10;
function aaa() {
alert(a);//undefined,查找a的时候会现在函数内查找,由于预解析的作用,此时的a是undefined,因此永远不会去查找外面的10了
var a = 20;
}
aaa();

变量的查找是就近原则,去寻找var定义的变量,当就近没有找到的时候就去查找外层。

2.

1
2
3
4
5
6
7
function a1() {
var a=b=1
}

a1();
alert(a);//报错
alert(b);//1

在函数a1()外面无法读取变量a,而var a=b=10这种写法在函数内,b其实是全局变量

CSS:line-height:150%与line-height:1.5的真正区别是什么

发表于 2017-02-14   |   分类于 笔记

语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/* Keyword values */
line-height: normal;

/* Unitless: use this number multiplied by the element's font size */
line-height: 3.5;

/* <length> values */
line-height: 3em;

/* <percentage> values */
line-height: 34%;

/* Global values */
line-height: inherit;
line-height: initial;
line-height: unset;

取值

  • normal

取决于用户代理。桌面浏览器(包括火狐浏览器)使用默认值,约为1.2,这取决于元素的 font-family。

  • <number>

该属性的应用值是这个无单位数字<number>乘以该元素的字体大小。计算值与指定值相同。大多数情况下,使用这种方法设置line-height是首选方法,在继承情况下不会有异常的值。

  • <length>

指定<length> 用于计算 line box 的高度。查看<length> 获取可能的单位。

  • <percentage>

与元素自身的字体大小有关。计算值是给定的百分比值乘以元素计算出的字体大小。

形式化语法

normal | <number> | <length> | <percentage>

例子

1
2
3
4
5
6
7
/* All rules below have the same resultant line height */

div { line-height: 1.2; font-size: 10pt } /* number */
div { line-height: 1.2em; font-size: 10pt } /* length */
div { line-height: 120%; font-size: 10pt } /* percentage */
div { line-height: 12pt; font-size: 10pt } /* length */
div { font: 10pt/1.2 Georgia,"Bitstream Charter",serif }

推荐使用无单位数值给line-height赋值

DEMO>>

阅读全文 »

提升 React ——React-router

发表于 2017-02-13   |   分类于 翻译

这篇文章是React系列三篇辅导教材的第一篇,由 Brad Westfall 编写,Haley 翻译。Brad 指出有很多关于React的入门教程,但是没有多到哪里去。如果你是个初出茅庐的 Reacter,我建议你关注一下这个视频,这些都是从基础的开始。

系列文章:
1、React Router
2、Container Components
3、Redux

当我第一次学习时,我发现很多初学者的指南(例如:开始和概念、构建一个应用、React生成环境、官方API)可以教大家如何构建一个但应用的组件,并把它们渲染到DOM中。他们做了一个很好的教学基础,像 JSX 和 props ,

系列说明

本系列还有一些代码托管在GitHub,通过这个系列,我们将构建一个基础的专注于用户和小工具的 SPA。

阅读全文 »

使用React在不同的DOM元素中渲染组件

发表于 2017-02-07   |   分类于 翻译

我刚刚开始使用React。在我的项目中,我创建了一个button。当用户点击这个创建的button时候,有些复杂的字母“a”出现在页面上。

然而,在我的html中,这个字母在按钮的兄弟元素当中,下面代码是我如何解决这个渲染元素的问题。

Attempt #1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import React from 'react';
import ReactDOM from 'react-dom';

const Letter = React.createClass({
render() {
return (
// lots of HTML stuff here...
)
}
});

var CapitalAButton = React.createClass({
getInitialState: function(){
return { showCapitalA: false };
},

showCapitalA: function(){
this.setState({
showCapitalA: true
});
},

render: function() {
return (
<div id="capital-button" onClick={this.showCapitalA}>
A
{ this.state.showCapitalA? ReactDOM.render(<Letter />, document.querySelector('#letter')) : null }
</div>
)
}
});

var ButtonChoices = React.createClass({
render: function() {
return (
<CapitalAButton />
)
}
});

ReactDOM.render(
<div id="a">
<ButtonChoices />
</div>,
document.querySelector('#button-group')
);

这个问题被我在45行创建。我试图创建的按钮放在了id为button-group元素当中,而不是 container 或其他,包括任何元素本身。

结果是,在27行代码,当我最后得到渲染 <Letter /> 元素的后,我告诉React找到一个不同的Dom元素并把组件写入到里面,这个Dom 为 #letter。

运行后,会得到这样的结果:

“Warning: _renderNewRootComponent(): Render methods should be a pure function of props and state; triggering nested component updates from render is not allowed. If necessary, trigger nested updates in componentDidUpdate. Check the render method of CapitalAButton.”

如果一个框架运行时给出这样的错误提示,我就要注意了,所以看下面……

Attempt #2

此时,最好的方法可能是设置原始组件在 container,这个组件包含这样一个事实,就是他有一个加 button-group 的id。但是我任就是在瞎搞。

我查看了一些资料关于如何实现 componentDidUpdate,如下:

  • http://stackoverflow.com/questions/24502898/show-or-hide-element-in-react-js
  • https://facebook.github.io/react/docs/component-specs.html#updating-componentdidupdate
  • http://busypeoples.github.io/post/react-component-lifecycle/
  • https://facebook.github.io/react/docs/top-level-api.html#reactdom.unmountcomponentatnode
    阅读全文 »

构建一个React-redux应用(知乎日报篇)

发表于 2017-01-13   |   分类于 笔记

背景

本项目是采用 React+redux 实现的知乎日报的App,所有API均来自网络(若涉及侵权,请及时联系我删除)

运行

  • 获取 git clone https://github.com/Hancoson/react-redux-demo.git
  • 安装 npm install(yarn)
  • 启动 npm start
  • 构建 npm build

对应技术

  • 底层技术 React+redux+react-router
  • 编码规范 ES6
  • 构建工具 webpack
  • UI Antd
  • API 采用Yahoo跨域访问代理
  • 其他工具技术 React-hot-load,babel,webpack-dev-server等

技术实现

react

A JAVASCRIPT LIBRARY FOR BUILDING USER INTERFACES

state & props

  • props(属性)和state(状态)的改变都会触发render函数来更新界面;
  • 属性(props)是由父组件传递给子组件的;
  • 状态(state)是组件内部维护的数据,当状态发生变化的同时,组件也会进行更新。 当状态发生转换时会触发不同的钩子函数,从而让开发者有机会做出相应操作。

react

生命周期

1
2
3
4
5
6
//初始化阶段
getDefaultPropos //只调用一次,实力之间共享引用
getInitialState //初始化每个实例特有的状态
componentWillMount //render之前最后一次修改状态的机会
render //只能访问this.props和this.state,只有一个顶层组件,不允许修改状态和DOM输出
componentDidMount //成功render并渲染完成真实DOM后触发,可以修改DOM
1
2
3
4
5
6
//运行中阶段
componentWillReceiveProps //父组件修改属性触发,可以修改新属性,修改状态
shouldComponentUpdate //返回false会阻止render调用
componentWillUpeate //不能修改属性和状态
render //只能访问this.props和this.state,只有一个顶层组件,不允许修改状态和DOM输出
componentDidUpdate //可以修改DOM
1
2
//销毁阶段
componentWillUnMount //在删除组件之前进行清理操作,比如计时器和事件监听器。
阅读全文 »
1234…6
Hancoson(墨萧)

Hancoson(墨萧)

Hancoson(墨萧)的博客,一名打拼多年的前端开发者的积累

51 日志
8 分类
64 标签
Github weibo Resume twitter
Links
  • Resume
  • VSOUI BLOG
  • GitHub Blog
© 2018 Hancoson(墨萧)
由 Hexo 强力驱动
主题 - NexT.Muse
Total visited times.