1.13 TeslaWheels Component
Finally, let’s make the final component TeslaWheels
. As always, create a directory src/components/TeslaWheels
, create a TeslaWheels
file in it, and enter the following code.
import React from 'react';import PropTypes from 'react';import './TeslaWheels.css';const LabelLists = (props) => {const value = props.wheels.value;const changeHandler = props.wheels.handleChangeWheels;const sizes = [19, 21];const LabelItems = sizes.map(size => (<label key={size} className={`tesla-wheels__item tesla-wheels__item--${size} ${value === size ? 'tesla-wheels__item--active' : '` }`}><inputtype="radio"name="wheelsize"value={size}checked={value === size}onChange={() => {changeHandler(size)}} /><p>{size}"</p></label>));return (<div>{LabelItems}</div>);}const TeslaWheels = (props) => (<div className="tesla-wheels__component"><p className="tesla-wheels__title">Wheels</p><div className="tesla-wheels__container cf"><LabelLists wheels={props}/></div></div>);TeslaWheels.propTypes = {value: PropTypes.number,handleChangeWheels: PropTypes.func}export default TeslaWheels;
Our implementation here is similar to the conversion of the props
array object to a list in the TeslaStats
component. Repeat the props.sizes
array using the javascript map()
function.
For each iteration, it returns the <label>
elements containing size
. Finally, the LabelItems
list is built into the TeslaWheels
component and rendered.
In the <label>
element, the effect of wheel animation is shown by changing the class according to the transmitted wheel size.
1.13.1 TeslaWheels Component Style
Create a TeslaWheels.css
file in the src/components/TeslaWheels
directory and specify the following styles. Since the code is long and omitted here, let’s check the source code.
.tesla-wheels__component {float: left;width: 355px;}.tesla-wheels__title {letter-spacing: 2px;font-size: 16px;}...
1.13.2 Import TeslaWheels Component in TeslaBattery Container
Finally, implement callback
in TeslaBattery
and pass it to the TeslaWheels
component.
Add import
to use the TeslaWheels
component in TeslaBattery.js
. We then implement callback function handleChangeWheels()
and bind it in constructor
. Then pass the callback function to the TeslaWheels
component as props
.
...import TeslaWheels from '../components/TeslaWheels';...constructor(props) {super(props);this.calculateStats = this.calculateStats.bind(this);this.increment = this.increment.bind(this);this.decrement = this.decrement.bind(this);this.handleChangeClimate = this.handleChangeClimate.bind(this);this.handleChangeWheels = this.handleChangeWheels.bind(this);this.statsUpdate = this.statsUpdate.bind(this);...handleChangeWheels(size) {const config = {...this.state.config};config['wheels'] = size;this.setState({ config });}...<TeslaWheelsvalue={this.state.config.wheels}handleChangeWheels={this.handleChangeWheels}/>...
The result of the completion of the wheels animation is as follows.
export function getModelData() { return { '60': { 19: { on: { speed: { 45: { '-10': 224, '0': 255, '10': 287, '20': 289, '30': 287, '40': 258 }, 50: { '-10': 211, '0': 238, '10': 264, '20': 267, '30': 267, '40': 244 }, 55: { '-10': 198, '0': 221, '10': 242, '20': 246, '30': 245, '40': 228 }, 60: { '-10': 184, '0': 204, '10': 222, '20': 225, '30': 226, '40': 212 }, 65: { '-10': 170, '0': 187, '10': 202, '20': 206, '30': 208, '40': 195 }, 70: { '-10': 156, '0': 172, '10': 185, '20': 189, '30': 190, '40': 179 }, } }, off: { speed: { 45: { '-10': 297, '0': 312, '10': 318, '20': 325, '30': 329, '40': 333 }, 50: { '-10': 269, '0': 283, '10': 288, '20': 294, '30': 298, '40': 304 }, 55: { '-10': 245, '0': 256, '10': 261, '20': 267, '30': 269, '40': 277 }, 60: { '-10': 221, '0': 231, '10': 236, '20': 242, '30': 243, '40': 252 }, 65: { '-10': 200, '0': 209, '10': 214, '20': 219, '30': 222, '40': 230 }, 70: { '-10': 181, '0': 189, '10': 194, '20': 199, '30': 202, '40': 209 }, } } }, 21: { on: { speed: { 45: { '-10': 220, '0': 251, '10': 283, '20': 285, '30': 282, '40': 284 }, 50: { '-10': 208, '0': 234, '10': 260, '20': 262, '30': 262, '40': 240 }, 55: { '-10': 194, '0': 216, '10': 238, '20': 241, '30': 240, '40': 224 }, 60: { '-10': 180, '0': 199, '10': 217, '20': 220, '30': 221, '40': 208 }, 65: { '-10': 166, '0': 183, '10': 198, '20': 202, '30': 203, '40': 191 }, 70: { '-10': 152, '0': 167, '10': 180, '20': 184, '30': 185, '40': 174 }, } }, off: { speed: { 45: { '-10': 292, '0': 307, '10': 314, '20': 320, '30': 324, '40': 328 }, 50: { '-10': 265, '0': 278, '10': 283, '20': 289, '30': 293, '40': 298 }, 55: { '-10': 240, '0': 251, '10': 256, '20': 261, '30': 264, '40': 272 }, 60: { '-10': 217, '0': 226, '10': 231, '20': 236, '30': 238, '40': 247 }, 65: { '-10': 196, '0': 204, '10': 209, '20': 214, '30': 217, '40': 225 }, 70: { '-10': 177, '0': 184, '10': 189, '20': 194, '30': 197, '40': 204 }, } } } }, '60D': { 19: { on: { speed: { 45: { '-10': 227, '0': 258, '10': 291, '20': 293, '30': 292, '40': 264 }, 50: { '-10': 215, '0': 242, '10': 269, '20': 271, '30': 272, '40': 250 }, 55: { '-10': 201, '0': 224, '10': 247, '20': 250, '30': 251, '40': 235 }, 60: { '-10': 187, '0': 207, '10': 226, '20': 229, '30': 232, '40': 217 }, 65: { '-10': 172, '0': 191, '10': 207, '20': 211, '30': 213, '40': 201 }, 70: { '-10': 158, '0': 175, '10': 189, '20': 193, '30': 195, '40': 185 }, } }, off: { speed: { 45: { '-10': 301, '0': 317, '10': 323, '20': 330, '30': 336, '40': 339 }, 50: { '-10': 275, '0': 288, '10': 294, '20': 301, '30': 306, '40': 311 }, 55: { '-10': 249, '0': 260, '10': 266, '20': 273, '30': 278, '40': 283 }, 60: { '-10': 225, '0': 236, '10': 241, '20': 248, '30': 251, '40': 258 }, 65: { '-10': 204, '0': 214, '10': 219, '20': 225, '30': 229, '40': 236 }, 70: { '-10': 184, '0': 193, '10': 198, '20': 205, '30': 207, '40': 215 }, } } }, 21: { on: { speed: { 45: { '-10': 223, '0': 255, '10': 287, '20': 289, '30': 288, '40': 260 }, 50: { '-10': 211, '0': 238, '10': 264, '20': 267, '30': 267, '40': 246 }, 55: { '-10': 197, '0': 220, '10': 242, '20': 246, '30': 246, '40': 230 }, 60: { '-10': 183, '0': 203, '10': 221, '20': 225, '30': 227, '40': 212 }, 65: { '-10': 168, '0': 186, '10': 202, '20': 206, '30': 208, '40': 196 }, 70: { '-10': 155, '0': 171, '10': 184, '20': 188, '30': 190, '40': 181 }, } }, off: { speed: { 45: { '-10': 297, '0': 312, '10': 319, '20': 326, '30': 331, '40': 335 }, 50: { '-10': 270, '0': 283, '10': 289, '20': 296, '30': 301, '40': 306 }, 55: { '-10': 244, '0': 256, '10': 261, '20': 268, '30': 272, '40': 278 }, 60: { '-10': 221, '0': 231, '10': 236, '20': 242, '30': 246, '40': 253 }, 65: { '-10': 199, '0': 209, '10': 214, '20': 220, '30': 223, '40': 231 }, 70: { '-10': 180, '0': 188, '10': 193, '20': 200, '30': 202, '40': 210 }, } } } }, '75': { 19: { on: { speed: { 45: { '-10': 271, '0': 309, '10': 347, '20': 350, '30': 347, '40': 312 }, 50: { '-10': 256, '0': 288, '10': 320, '20': 323, '30': 323, '40': 295 }, 55: { '-10': 240, '0': 267, '10': 293, '20': 297, '30': 297, '40': 276 }, 60: { '-10': 222, '0': 246, '10': 268, '20': 272, '30': 273, '40': 257 }, 65: { '-10': 205, '0': 227, '10': 245, '20': 250, '30': 252, '40': 236 }, 70: { '-10': 189, '0': 206, '10': 224, '20': 228, '30': 230, '40': 216 }, } }, off: { speed: { 45: { '-10': 359, '0': 377, '10': 385, '20': 393, '30': 398, '40': 403 }, 50: { '-10': 326, '0': 342, '10': 349, '20': 356, '30': 360, '40': 368 }, 55: { '-10': 296, '0': 309, '10': 316, '20': 323, '30': 326, '40': 335 }, 60: { '-10': 268, '0': 280, '10': 286, '20': 292, '30': 295, '40': 305 }, 65: { '-10': 242, '0': 253, '10': 259, '20': 265, '30': 268, '40': 278 }, 70: { '-10': 219, '0': 229, '10': 234, '20': 241, '30': 244, '40': 253 }, } } }, 21: { on: { speed: { 45: { '-10': 267, '0': 304, '10': 342, '20': 344, '30': 342, '40': 308 }, 50: { '-10': 251, '0': 283, '10': 314, '20': 317, '30': 317, '40': 290 }, 55: { '-10': 235, '0': 262, '10': 287, '20': 291, '30': 291, '40': 271 }, 60: { '-10': 218, '0': 241, '10': 262, '20': 266, '30': 267, '40': 251 }, 65: { '-10': 201, '0': 222, '10': 239, '20': 244, '30': 246, '40': 231 }, 70: { '-10': 184, '0': 203, '10': 218, '20': 223, '30': 224, '40': 211 }, } }, off: { speed: { 45: { '-10': 353, '0': 372, '10': 279, '20': 387, '30': 392, '40': 397 }, 50: { '-10': 320, '0': 336, '10': 343, '20': 350, '30': 354, '40': 361 }, 55: { '-10': 290, '0': 303, '10': 309, '20': 316, '30': 319, '40': 329 }, 60: { '-10': 262, '0': 274, '10': 279, '20': 286, '30': 288, '40': 299 }, 65: { '-10': 237, '0': 247, '10': 253, '20': 259, '30': 262, '40': 272 }, 70: { '-10': 214, '0': 223, '10': 229, '20': 235, '30': 238, '40': 247 }, } } } }, '75D': { 19: { on: { speed: { 45: { '-10': 227, '0': 316, '10': 356, '20': 358, '30': 357, '40': 323 }, 50: { '-10': 262, '0': 296, '10': 328, '20': 332, '30': 332, '40': 305 }, 55: { '-10': 246, '0': 274, '10': 302, '20': 306, '30': 307, '40': 287 }, 60: { '-10': 228, '0': 253, '10': 276, '20': 280, '30': 283, '40': 265 }, 65: { '-10': 211, '0': 233, '10': 253, '20': 257, '30': 260, '40': 246 }, 70: { '-10': 194, '0': 214, '10': 231, '20': 236, '30': 238, '40': 226 }, } }, off: { speed: { 45: { '-10': 368, '0': 387, '10': 395, '20': 404, '30': 410, '40': 415 }, 50: { '-10': 335, '0': 351, '10': 359, '20': 367, '30': 374, '40': 380 }, 55: { '-10': 304, '0': 318, '10': 325, '20': 334, '30': 339, '40': 346 }, 60: { '-10': 275, '0': 288, '10': 294, '20': 303, '30': 307, '40': 316 }, 65: { '-10': 249, '0': 261, '10': 267, '20': 275, '30': 279, '40': 289 }, 70: { '-10': 225, '0': 236, '10': 242, '20': 250, '30': 253, '40': 263 }, } } }, 21: { on: { speed: { 45: { '-10': 273, '0': 311, '10': 351, '20': 354, '30': 352, '40': 318 }, 50: { '-10': 258, '0': 291, '10': 323, '20': 326, '30': 327, '40': 300 }, 55: { '-10': 241, '0': 269, '10': 296, '20': 300, '30': 301, '40': 281 }, 60: { '-10': 223, '0': 248, '10': 270, '20': 275, '30': 277, '40': 259 }, 65: { '-10': 206, '0': 228, '10': 247, '20': 252, '30': 254, '40': 240 }, 70: { '-10': 189, '0': 209, '10': 225, '20': 230, '30': 232, '40': 221 }, } }, off: { speed: { 45: { '-10': 363, '0': 382, '10': 390, '20': 398, '30': 405, '40': 409 }, 50: { '-10': 330, '0': 346, '10': 353, '20': 361, '30': 368, '40': 373 }, 55: { '-10': 299, '0': 312, '10': 319, '20': 327, '30': 333, '40': 340 }, 60: { '-10': 270, '0': 282, '10': 288, '20': 296, '30': 301, '40': 309 }, 65: { '-10': 244, '0': 255, '10': 261, '20': 269, '30': 273, '40': 282 }, 70: { '-10': 219, '0': 230, '10': 236, '20': 244, '30': 247, '40': 257 }, } } } }, '90D': { 19: { on: { speed: { 45: { '-10': 308, '0': 349, '10': 392, '20': 394, '30': 392, '40': 357 }, 50: { '-10': 292, '0': 326, '10': 362, '20': 365, '30': 365, '40': 338 }, 55: { '-10': 273, '0': 303, '10': 332, '20': 336, '30': 337, '40': 317 }, 60: { '-10': 254, '0': 280, '10': 305, '20': 308, '30': 310, '40': 293 }, 65: { '-10': 235, '0': 258, '10': 279, '20': 283, '30': 285, '40': 273 }, 70: { '-10': 216, '0': 238, '10': 256, '20': 260, '30': 263, '40': 253 }, } }, off: { speed: { 45: { '-10': 406, '0': 426, '10': 434, '20': 443, '30': 451, '40': 455 }, 50: { '-10': 370, '0': 386, '10': 394, '20': 403, '30': 412, '40': 416 }, 55: { '-10': 336, '0': 350, '10': 358, '20': 366, '30': 274, '40': 380 }, 60: { '-10': 304, '0': 317, '10': 324, '20': 332, '30': 338, '40': 347 }, 65: { '-10': 276, '0': 288, '10': 295, '20': 302, '30': 308, '40': 317 }, 70: { '-10': 250, '0': 261, '10': 268, '20': 275, '30': 279, '40': 290 }, } } }, 21: { on: { speed: { 45: { '-10': 304, '0': 345, '10': 386, '20': 388, '30': 387, '40': 352 }, 50: { '-10': 287, '0': 321, '10': 356, '20': 359, '30': 360, '40': 332 }, 55: { '-10': 268, '0': 297, '10': 326, '20': 330, '30': 330, '40': 311 }, 60: { '-10': 249, '0': 274, '10': 299, '20': 302, '30': 303, '40': 287 }, 65: { '-10': 230, '0': 253, '10': 273, '20': 277, '30': 279, '40': 267 }, 70: { '-10': 211, '0': 232, '10': 250, '20': 254, '30': 257, '40': 247 }, } }, off: { speed: { 45: { '-10': 401, '0': 420, '10': 428, '20': 437, '30': 446, '40': 449 }, 50: { '-10': 364, '0': 380, '10': 388, '20': 397, '30': 405, '40': 410 }, 55: { '-10': 330, '0': 344, '10': 351, '20': 359, '30': 367, '40': 373 }, 60: { '-10': 298, '0': 311, '10': 318, '20': 325, '30': 331, '40': 340 }, 65: { '-10': 270, '0': 282, '10': 288, '20': 296, '30': 301, '40': 310 }, 70: { '-10': 244, '0': 255, '10': 262, '20': 269, '30': 273, '40': 284 }, } } } }, 'P100D': { 19: { on: { speed: { 45: { '-10': 341, '0': 390, '10': 439, '20': 442, '30': 440, '40': 401 }, 50: { '-10': 323, '0': 365, '10': 405, '20': 409, '30': 410, '40': 380 }, 55: { '-10': 303, '0': 339, '10': 372, '20': 376, '30': 379, '40': 353 }, 60: { '-10': 282, '0': 313, '10': 341, '20': 345, '30': 347, '40': 329 }, 65: { '-10': 261, '0': 289, '10': 312, '20': 317, '30': 318, '40': 306 }, 70: { '-10': 240, '0': 265, '10': 285, '20': 290, '30': 293, '40': 283 }, } }, off: { speed: { 45: { '-10': 447, '0': 474, '10': 485, '20': 496, '30': 505, '40': 509 }, 50: { '-10': 408, '0': 431, '10': 441, '20': 451, '30': 461, '40': 466 }, 55: { '-10': 372, '0': 391, '10': 400, '20': 409, '30': 419, '40': 425 }, 60: { '-10': 337, '0': 354, '10': 362, '20': 371, '30': 377, '40': 388 }, 65: { '-10': 306, '0': 321, '10': 329, '20': 337, '30': 341, '40': 354 }, 70: { '-10': 277, '0': 291, '10': 299, '20': 307, '30': 311, '40': 323 }, } } }, 21: { on: { speed: { 45: { '-10': 322, '0': 369, '10': 414, '20': 417, '30': 416, '40': 379 }, 50: { '-10': 306, '0': 347, '10': 384, '20': 388, '30': 389, '40': 360 }, 55: { '-10': 228, '0': 323, '10': 354, '20': 358, '30': 360, '40': 336 }, 60: { '-10': 269, '0': 299, '10': 325, '20': 329, '30': 331, '40': 313 }, 65: { '-10': 250, '0': 276, '10': 299, '20': 303, '30': 305, '40': 292 }, 70: { '-10': 230, '0': 254, '10': 273, '20': 278, '30': 281, '40': 271 }, } }, off: { speed: { 45: { '-10': 422, '0': 447, '10': 458, '20': 468, '30': 477, '40': 481 }, 50: { '-10': 387, '0': 409, '10': 418, '20': 428, '30': 437, '40': 442 }, 55: { '-10': 353, '0': 372, '10': 380, '20': 389, '30': 398, '40': 404 }, 60: { '-10': 322, '0': 338, '10': 345, '20': 354, '30': 359, '40': 370 }, 65: { '-10': 293, '0': 307, '10': 315, '20': 323, '30': 326, '40': 339 }, 70: { '-10': 265, '0': 279, '10': 286, '20': 294, '30': 298, '40': 310 }, } } } } } }