Skip to content

Instantly share code, notes, and snippets.

@skulden13
Forked from anonymous/scifi.html
Last active January 11, 2016 21:19
Show Gist options
  • Save skulden13/4169b09ef76d2568e78e to your computer and use it in GitHub Desktop.
Save skulden13/4169b09ef76d2568e78e to your computer and use it in GitHub Desktop.
Задание для https://goo.gl/WGrXbu
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>Sci-Fi</title>
<link rel="stylesheet" type="text/css" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
<script src="https://fb.me/react-0.14.3.js"></script>
<script src="https://fb.me/react-dom-0.14.3.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.23/browser.min.js"></script>
</head>
<body>
<div class="container">
<h1>Задание №4</h1>
<div class="row">
<div class="col-md-6">
<p>Это страница создания персонажа в онлайн-игрушке по мотивам научной фантастики начала XX века (игрушка воображаемая, мы её придумали специально для этого задания). Нужно сделать <strong>компонент на React.js для выбора параметров персонажа:</strong> планеты, расы и пола.</p>
<ul>
<li>планет всего три: «Земля», «Марс» и «Венера»;</li>
<li>рас три: люди, марсиане и венерианцы. Марсиане могут быть только с Марса, венерианцы только с Венеры, а люди могут с любой из трёх планет;</li>
<li>полов у людей два, у венерианцев — три (кроме мужского и женского есть средний), у марсиан пол вообще один (мужской).</li>
</ul>
<p>При создании компонента рекомендуется придерживаться здравого смысла и минимализма.</p>
</div>
<div class="col-md-6">
<form>
<div class="form-group">
<label for="name">Имя</label>
<input class="form-control" name="name" id="name">
</div>
<div id="fps-container"></div>
<input type="submit" class="btn btn-primary" value="Создать персонажа">
</form>
</div>
</div>
</div>
<script type="text/babel">
var FantasticData = {
planets: {
earth: 'Земля',
mars: 'Марс',
venus: 'Венера'
},
genders: {
male: 'мужской',
female: 'женский',
neuter: 'средний'
},
races: {
earthman: 'землянин',
martian: 'марсианин',
venusian: 'венерианец'
}
};
var FantasticDataRules = {
earthman: {
genders: [FantasticData.genders.male, FantasticData.genders.female],
planets: [FantasticData.planets.earth, FantasticData.planets.mars, FantasticData.planets.venus]
},
martian: {
genders: [FantasticData.genders.male],
planets: [FantasticData.planets.mars]
},
venusian: {
genders: [FantasticData.genders.male, FantasticData.genders.female, FantasticData.genders.neuter],
planets: [FantasticData.planets.venus]
}
};
var FantasticSelect = React.createClass({
getDefaultProps: function() {
return {
id: 0,
options: [],
labelName: '',
value: ''
}
},
render: function() {
var options = [];
for (var i = 0; i < this.props.options.length; i++) {
options.push(<option value={this.props.options[i]} key={i}>{this.props.options[i]}</option>);
}
return (
<div className="form-group">
<label htmlFor={this.props.id}> {this.props.labelName} </label>
<select className="form-control" value={this.props.value} name={this.props.id} onChange={this.props.onChange}>
{options}
</select>
</div>
);
}
});
var FantasticPersonSelector = React.createClass({
getInitialState: function() {
return {
race: this.props.race,
gender: this.props.gender,
planet: this.props.planet,
races: function() {
var result = [];
for (var item in FantasticData.races) {
result.push(FantasticData.races[item]);
}
return result;
}(),
genders: FantasticDataRules[this.props.race].genders,
planets: FantasticDataRules[this.props.race].planets
}
},
getValueByKey: function(key, arr) {
var result = '';
for (var item in arr) {
if (item === key) {
result = arr[item];
}
}
return result;
},
getKeyByValue: function(value, arr) {
var result = '';
for (var item in arr) {
if (arr[item] === value) {
result = item;
}
}
return result;
},
getRace: function(value) {
return this.getValueByKey(value, FantasticData.races);
},
getGender: function(value) {
return this.getValueByKey(value, FantasticData.genders);
},
getPlanet: function(value) {
return this.getValueByKey(value, FantasticData.planets);
},
raceOnChange: function(e) {
var race = this.getKeyByValue(e.target.value, FantasticData.races);
this.setState({
race: race,
gender: this.getKeyByValue(FantasticDataRules[race].genders[0], FantasticData.genders),
planet: this.getKeyByValue(FantasticDataRules[race].planets[0], FantasticData.planets),
genders: FantasticDataRules[race].genders,
planets: FantasticDataRules[race].planets
});
},
genderOnChange: function(e) {
this.setState({[e.target.name]: this.getKeyByValue(e.target.value, FantasticData.genders)});
},
planetOnChange: function(e) {
this.setState({[e.target.name]: this.getKeyByValue(e.target.value, FantasticData.planets)});
},
render: function() {
return (
<div>
<FantasticSelect options={this.state.races} labelName="Раса" id="race" value={this.getRace(this.state.race)} onChange={this.raceOnChange} />
<FantasticSelect options={this.state.genders} labelName="Пол" id="gender" value={this.getGender(this.state.gender)} onChange={this.genderOnChange} />
<FantasticSelect options={this.state.planets} labelName="Планета" id="planet" value={this.getPlanet(this.state.planet)} onChange={this.planetOnChange} />
<br />
</div>
);
}
});
var fantasticPerson = ReactDOM.render(<FantasticPersonSelector race="martian" gender="male" planet="mars" /> ,
document.getElementById('fps-container')
);
</script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment