jimu-mobile
Version:
积木组件库助力移动端开发
363 lines (329 loc) • 12.2 kB
JavaScript
;
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
/*
<Brand
cityArr={cityArr} // 城市数组
dataAttrName={ // 城市对象的默认属性为// city_id、city_name、first_char,如果对象不是这三个属性名,请把属性名传进去
{
id:'city_id',
name:'city_name',
firstChar:'first_char'
}
}
callBack={this.selectCallBack.bind(this)} 选择完以后,回调函数
/>
*/
var Brand = function (_Component) {
_inherits(Brand, _Component);
function Brand(props) {
_classCallCheck(this, Brand);
var _this = _possibleConstructorReturn(this, (Brand.__proto__ || Object.getPrototypeOf(Brand)).call(this, props));
var i = 0;
var firstChar = [];
// 把26个字母放进数组里
while (i < 26) {
firstChar.push(String.fromCharCode(i + 97).toLocaleUpperCase());
i++;
}
_this.fast_charTouchMove = _this.fast_charTouchMove.bind(_this);
_this.fast_charTouchEnd = _this.fast_charTouchEnd.bind(_this);
_this.fast_charClick = _this.fast_charClick.bind(_this);
_this.carClick = _this.carClick.bind(_this);
_this.hotCarBrandClick = _this.hotCarBrandClick.bind(_this);
_this.initMaxChar = _this.initMaxChar.bind(_this);
_this.initHotCarBrandCon = _this.initHotCarBrandCon.bind(_this);
_this.initCarBrandCon = _this.initCarBrandCon.bind(_this);
_this.init_fast_char = _this.init_fast_char.bind(_this);
_this.state = {
selectBrand: null,
max_char: 'A',
showMaxChar: false,
firstChar: firstChar
};
return _this;
}
_createClass(Brand, [{
key: 'componentWillMount',
value: function componentWillMount() {
var _props = this.props,
carArr = _props.carArr,
dataAttrName = _props.dataAttrName;
if (carArr) {
// 如果是对象的话,需要转换一下
if (!carArr.length) {
var carObj = carArr;
carArr = [];
this.state.firstChar.map(function (char) {
if (carObj[char]) {
carObj[char].map(function (ele) {
ele[dataAttrName.firstChar] = char;
carArr.push(ele);
});
}
});
}
var Obj = {};
/* 把城市分成数组,字母相同的在一组 */
carArr.map(function (ele, i) {
var firstChar = ele[dataAttrName.firstChar];
if (!Obj[firstChar]) {
Obj[firstChar] = [];
}
Obj[firstChar].push(carArr[i]);
});
this.setState({ carObj: Obj });
}
}
/* 初始化右侧字母栏 */
}, {
key: 'init_fast_char',
value: function init_fast_char() {
var self = this;
var fast_charTouchMove = this.fast_charTouchMove,
fast_charTouchEnd = this.fast_charTouchEnd,
fast_charClick = this.fast_charClick,
state = this.state;
var carObj = state.carObj,
firstChar = state.firstChar;
return _react2.default.createElement(
'div',
{
className: 'fast_char',
onTouchMove: fast_charTouchMove,
onTouchEnd: fast_charTouchEnd
},
firstChar.map(function (char, i) {
if (carObj[char]) {
return _react2.default.createElement(
'a',
{
href: 'javascript:;',
'data-char': char,
key: i,
onClick: fast_charClick
},
char
);
}
return null;
})
);
}
/* 解决锚点会产生历史记录,点后退,退不出当前页面的问题 */
}, {
key: 'fast_charClick',
value: function fast_charClick(e) {
var fastCharEle = e.currentTarget;
var ele = document.querySelector('#first_char_' + fastCharEle.dataset.char);
var _carBrandCon = document.querySelector('._carBrandCon');
_carBrandCon.scrollTop = ele.offsetTop;
}
/* 城市点击事件 */
}, {
key: 'carClick',
value: function carClick(e) {
var callBack = this.props.callBack;
var carObj = JSON.parse(e.currentTarget.dataset.carobj);
this.setState({
selectBrand: carObj
});
callBack && callBack(carObj);
}
}, {
key: 'fast_charTouchMove',
value: function fast_charTouchMove(e) {
var _e$targetTouches$ = e.targetTouches[0],
clientX = _e$targetTouches$.clientX,
clientY = _e$targetTouches$.clientY;
var ele = document.elementFromPoint(clientX, clientY) || {};
var dataset = ele.dataset;
if (ele && dataset.char) {
this.setState({
maxChar: dataset.char,
showMaxChar: true
});
ele.click();
}
e.preventDefault();
}
}, {
key: 'fast_charTouchEnd',
value: function fast_charTouchEnd() {
this.setState({
showMaxChar: false
});
}
}, {
key: 'initCarBrandCon',
value: function initCarBrandCon() {
var self = this;
var _state = this.state,
carObj = _state.carObj,
selectBrand = _state.selectBrand;
var dataAttrName = this.props.dataAttrName;
if (!carObj) {
return null;
}
return _react2.default.createElement(
'ul',
{ className: 'carBrandCon' },
function () {
var arr = [];
for (var a in carObj) {
arr.push(_react2.default.createElement(
'li',
{ key: a, id: 'first_char_' + a },
_react2.default.createElement(
'a',
{
className: 'first_char',
href: 'javascript:;'
},
a
),
carObj[a].map(function (ele, index) {
var isCheck = false;
if (selectBrand && selectBrand.id && selectBrand[dataAttrName.id] === ele[dataAttrName.id]) {
isCheck = true;
}
{/* div不用label是因为label click 会触发两次 */}
return _react2.default.createElement(
'div',
{
className: 'list' + (isCheck ? ' select' : ''),
key: index,
id: 'car_' + ele[dataAttrName.id],
'data-carobj': JSON.stringify(ele),
onClick: self.carClick
},
_react2.default.createElement('img', { src: '' + self.props.staticImgURL + ele.id + '.jpg' }),
_react2.default.createElement(
'span',
{
className: 'carBrandName'
},
ele[dataAttrName.name]
)
);
})
));
}
return arr;
}()
);
}
/* 点击定位城市的事件 */
}, {
key: 'hotCarBrandClick',
value: function hotCarBrandClick(e) {
document.getElementById('car_' + e.currentTarget.dataset.carid).click();
}
}, {
key: 'initHotCarBrandCon',
value: function initHotCarBrandCon() {
var _this2 = this;
var _props2 = this.props,
dataAttrName = _props2.dataAttrName,
staticImgURL = _props2.staticImgURL,
hotCarBrandData = _props2.hotCarBrandData;
var selectBrand = this.state.selectBrand;
if (!hotCarBrandData) {
return null;
}
return _react2.default.createElement(
'div',
null,
_react2.default.createElement(
'div',
{ className: 'selectTitle' },
'\u70ED\u95E8\u8F66\u578B'
),
_react2.default.createElement(
'ul',
{
className: 'hotCarBrandCon clearfix'
},
hotCarBrandData.map(function (ele, index) {
var isCheck = false;
if (selectBrand && selectBrand.id && selectBrand[dataAttrName.id] === ele[dataAttrName.id]) {
isCheck = true;
}
return _react2.default.createElement(
'li',
{
key: index,
className: 'hotCarBrandList ' + (isCheck ? 'select' : null),
'data-carid': ele.id,
onClick: _this2.hotCarBrandClick
},
_react2.default.createElement('img', { src: '' + staticImgURL + ele.id + '.jpg' }),
_react2.default.createElement(
'span',
{ className: 'hotCarBrandName block' },
ele[dataAttrName.name]
)
);
})
)
);
}
}, {
key: 'initMaxChar',
value: function initMaxChar() {
var _state2 = this.state,
maxChar = _state2.maxChar,
showMaxChar = _state2.showMaxChar;
if (!showMaxChar) {
return null;
}
return _react2.default.createElement(
'div',
{ className: 'max_char' },
maxChar
);
}
}, {
key: 'render',
value: function render() {
var _props3 = this.props,
carArr = _props3.carArr,
dataAttrName = _props3.dataAttrName,
callBack = _props3.callBack,
show = _props3.show,
hotCarBrandData = _props3.hotCarBrandData,
other = _objectWithoutProperties(_props3, ['carArr', 'dataAttrName', 'callBack', 'show', 'hotCarBrandData']);
if (!show) {
return null;
}
return _react2.default.createElement(
'div',
{ className: 'catBrandWrap' },
this.initMaxChar(),
_react2.default.createElement(
'div',
_extends({ className: '_carBrandCon' }, other),
hotCarBrandData ? this.initHotCarBrandCon() : null,
this.initCarBrandCon()
),
this.init_fast_char()
);
}
}]);
return Brand;
}(_react.Component);
Brand.defaultProps = {
dataAttrName: {
id: 'id',
name: 'name',
firstChar: 'first_char'
}
};
module.exports = Brand;