<html>
<head>
<script src="//fb.me/react-0.13.1.js"></script>
<meta charset="utf-8">
<title>JS Bin</title>
</head>
<body>
<div id=short></div>
<hr>
<div id=long></div>
</body>
</html>
class Widget extends React.Component {
render () {
return (
<div className="widget">
<h1 ref="title" className="widget__title">{this.props.title}</h1>
<div ref="content" className="widget__content">{this.props.content}</div>
</div>
)
}
}
let tweetLength = createChainableTypeChecker(tweetLengthChecker);
Widget.propTypes = {
title: tweetLength.isRequired,
content: React.PropTypes.node.isRequired
}
function tweetLengthChecker(props, propName, componentName, location) {
componentName = componentName || 'ANONYMOUS';
if (props[propName]) {
let value = props[propName];
if (typeof value === 'string') {
return value.length <= 140 ? null : new Error(propName + ' in ' + componentName + " is longer than 140 characters");
}
}
// assume all ok
return null;
}
function createChainableTypeChecker(validate) {
function checkType(isRequired, props, propName, componentName, location) {
componentName = componentName || ANONYMOUS;
if (props[propName] == null) {
var locationName = ReactPropTypeLocationNames[location];
if (isRequired) {
return new Error(
("Required " + locationName + " `" + propName + "` was not specified in ") +
("`" + componentName + "`.")
);
}
return null;
} else {
return validate(props, propName, componentName, location);
}
}
let chainedCheckType = checkType.bind(null, false);
chainedCheckType.isRequired = checkType.bind(null, true);
return chainedCheckType;
}
let shortTitle = "This is a short title";
let longTitle = "This is a very long title that is hugely over the 140 character limit imposed by our lovely new validator. Notice that a warn is generated, but we actually still see the rendered output as React choses to warn rather than throw the exception.";
let shortContainer = document.getElementById('short');
let longContainer = document.getElementById('long');
React.render(<Widget title={shortTitle} content="This is our content" />, shortContainer);
React.render(<Widget title={longTitle} content="This is our content" />, longContainer);
Output
You can jump to the latest bin by adding /latest
to your URL
Keyboard Shortcuts
Shortcut | Action |
---|---|
ctrl + [num] | Toggle nth panel |
ctrl + 0 | Close focused panel |
ctrl + enter | Re-render output. If console visible: run JS in console |
Ctrl + l | Clear the console |
ctrl + / | Toggle comment on selected lines |
ctrl + ] | Indents selected lines |
ctrl + [ | Unindents selected lines |
tab | Code complete & Emmet expand |
ctrl + shift + L | Beautify code in active panel |
ctrl + s | Save & lock current Bin from further changes |
ctrl + shift + s | Open the share options |
ctrl + y | Archive Bin |
Complete list of JS Bin shortcuts |
JS Bin URLs
URL | Action |
---|---|
/ | Show the full rendered output. This content will update in real time as it's updated from the /edit url. |
/edit | Edit the current bin |
/watch | Follow a Code Casting session |
/embed | Create an embeddable version of the bin |
/latest | Load the very latest bin (/latest goes in place of the revision) |
/[username]/last | View the last edited bin for this user |
/[username]/last/edit | Edit the last edited bin for this user |
/[username]/last/watch | Follow the Code Casting session for the latest bin for this user |
/quiet | Remove analytics and edit button from rendered output |
.js | Load only the JavaScript for a bin |
.css | Load only the CSS for a bin |
Except for username prefixed urls, the url may start with http://jsbin.com/abc and the url fragments can be added to the url to view it differently. |